一个Group
实例可以包含Person
实例或其他Group
实例。我想使用 Ancestry gem 来反映层次结构,但 Ancestry 似乎不适用于两种不同的模型。我不想使用单表继承Person
,Model
因为它们在概念上是不同的。
对此需求进行建模的最佳方法是什么?我愿意使用多对多或其他类型的关联来构建自己的层次结构,但我不确定如何使两个模型(Person
和Group
)相互配合。
谢谢你。
一个Group
实例可以包含Person
实例或其他Group
实例。我想使用 Ancestry gem 来反映层次结构,但 Ancestry 似乎不适用于两种不同的模型。我不想使用单表继承Person
,Model
因为它们在概念上是不同的。
对此需求进行建模的最佳方法是什么?我愿意使用多对多或其他类型的关联来构建自己的层次结构,但我不确定如何使两个模型(Person
和Group
)相互配合。
谢谢你。
听起来您想使用多态关联。有关简单示例,请参见 rails 指南:http: //guides.rubyonrails.org/association_basics.html#polymorphic-associations
编辑更新以包括层次结构:
听起来您需要几个新模型,例如“级别”和“子级”:
团体模型:
has_many :children, :as => :groupable
belongs_to :level
人物模型:
has_many :children, :as => :groupable
级别模型:
has_many :children
has_one :group
attr_accessible :level (integer)
儿童型号:
belongs_to :groupable, :polymorphic => true
可以通过结合子模型和级别模型来简化这一点,但我不知道 ActiveRecord 是否可以处理两个表之间的两种关系(一个用于作为组或人的子组,一个用于父组,其中听起来它总是一个组)
您的层次结构级别将由level
级别模型中的整数反映。
您可以轻松地在 Group 类上设置层次结构(使用适合您的单模型层次结构),然后在 Groups 和 Users 之间添加一对多关联:
class Group < AR::Base
acts_as_tree # or whatever is called in your preferred tree implementation
has_many :users
end
class User < AR::Base
belongs_to :group
end
你将会有
@group.children # => a list of groups
@group.parent # => another group or nil if root
@group.users # => the users directly below this group
@user.group # => a group
如果您确实需要该组拥有用户或子组但不能同时拥有两者,请使用验证规则。