什么是在Rails中实现层次关系的最佳实践?

时间:2013-04-04 17:35:52

标签: ruby-on-rails activerecord

我想为属于组的用户和属于组的组建模,所以我正在思考(原谅newb语法):

class Group < ActiveRecord::Base
  attr_accessible :description, :group_id, :name
  has_and_belongs_to_many :users
end

class User < ActiveRecord::Base
  attr_accessible :email, :name
  has_and_belongs_to_many :groups
end

以上是否是实施此方法的首选方式?是否有一种简单的方法可以删除“父”组并让它删除它的孩子?

在撰写本文时,我正在学习rails 3.2.x ...

2 个答案:

答案 0 :(得分:4)

我讨厌成为一名宝石推动者,但我最近开始使用ancestry,它运作良好。它有一种独特的方式来索引祖先和后代,以获得出色的表现。

还有Railscast覆盖它。

  

Ancestry是一个gem /插件,允许Ruby on Rails的记录   ActiveRecord模型被组织为树结构(或层次结构)。   它使用单个,直观格式化的数据库列,使用   物化路径模式的变化。它揭露了所有的   标准树结构关系(祖先,父母,根,儿童,   兄弟姐妹,后代)和所有这些都可以在一个SQL中获取   查询。其他功能包括STI支持,范围,深度缓存,   深度限制,从旧插件/宝石轻松迁移,完整性   检查,完整性恢复,将(子)树安排成哈希   以及处理孤立记录的不同策略。

     

来源:https://github.com/stefankroes/ancestry#readme

答案 1 :(得分:2)

我在这里猜测 - 但用户是否可以在多个群组中,群组只能在一个群组中(父群组)?

class Group < ActiveRecord::Base
  attr_accessible :description, :name
  has_many :groups, :dependent => :destroy
  has_many :group_users, :dependent => :destroy
  has_many :users, :through => :group_users
  belongs_to :parent_group, :class_name => :group
end

class GroupUsers < ActiveRecord::Base
  belongs_to :group
  belongs_to :user
end

class User < ActiveRecord::Base
  attr_accessible :email, :name
  has_many :group_users, :dependent => :destroy
  has_many :groups, :through => :group_users
end