Rails HABTM还是has_many?

时间:2015-04-26 17:37:14

标签: ruby-on-rails many-to-many relational-database

我有两个模型:Person和Property。在Person模型中,我有一个存储人员角色的字段(租户,所有者,管理员,承包商等)。由于每个属性都属于所有者,并且可能有一个或多个租户,我认为这是使用HABTM模型关系的好机会。

我有这个权利吗?

另外,如何参考附件型号?假设我的连接模型名为PropertiesPeople,并且我想获取特定属性的租户,那会是以下内容吗?

@property.people.where(:role => "tenant")

1 个答案:

答案 0 :(得分:1)

如果同一个人可以拥有多个属性,则应该使用HABTM。像这样:

class Person < ActiveRecord::Base
  # in the people table you are storing the 'role' value
  has_and_belongs_to_many :properties, join_table: 'people_properties'
end

class Property < ActiveRecord::Base
  has_and_belongs_to_many :people, join_table: 'people_properties'
end

您应该使用外键people_propertiesperson_id创建中间表property_id

这种方法的问题在于,如果一个人可以在一个财产中“租户”而在另一个财产中可以是“承包商”,例如,您无法存储该信息。在这种情况下,我建议使用中间模型,如下

class Person < ActiveRecord::Base
    has_many :property_people
    has_many :properties, through: :property_people
end

class PropertyPerson
    # now you store here the 'role' value
    belongs_to :person
    belongs_to :property
end

class Property < ActiveRecord::Base
    has_many :property_people
    has_many :people, through: :property_people
end

我不确定是否从关系名称成功推断出类名,在这种情况下,您始终可以为关联指示class_name甚至foreign_key。您还可以使用self.table_name=

指明模型的表格