>Group
实例可以包含Person
实例或其他Group
实例。我想使用 Ancestry gem 来镜像层次结构,但 Ancestry 似乎不适用于两种不同的模型。我不想在Person
和Model
上使用单表继承,因为它们在概念上是不同的。
需求进行建模的最佳方法是什么?我愿意使用多对多或其他类型的关联来构建自己的层次结构,但我不确定如何使这两个模型(Person
和Group
)相互配合。
谢谢。
您可以轻松地在组类上设置层次结构(使用适合您的单模型层次结构的任何层次结构),然后在组和用户之间添加一对多关联:
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
如果确实需要组具有用户或子组,但不能同时具有两者,请使用验证规则。
听起来你想使用多态关联。有关一个简单的示例,请参阅导轨指南: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
整数反映。