2

一个Group实例可以包含Person实例或其他Group实例。我想使用 Ancestry gem 来反映层次结构,但 Ancestry 似乎不适用于两种不同的模型。我不想使用单表继承PersonModel因为它们在概念上是不同的。

对此需求进行建模的最佳方法是什么?我愿意使用多对多或其他类型的关联来构建自己的层次结构,但我不确定如何使两个模型(PersonGroup)相互配合。

谢谢你。

4

2 回答 2

1

听起来您想使用多态关联。有关简单示例,请参见 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级别模型中的整数反映。

于 2012-10-16T22:33:41.640 回答
1

您可以轻松地在 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

如果您确实需要该组拥有用户或子组但不能同时拥有两者,请使用验证规则。

于 2012-10-17T00:11:52.473 回答