背景 我在概念上思考如何引用可以属于多个模型的单个对象。例如,如果我有学校和雇主模型 - 理论上用户可以在同一所学校就读和就业。理想情况下,两种关系都指向同一个对象。
问题: 我将如何在基于postgresql的Rails应用程序中对其进行建模?
更新 在这种情况下,我需要一个用户能够拥有一个或多个学校和一个或多个雇主。
答案 0 :(得分:2)
编辑:反映问题是关于HABTM
如果您希望能够在User.employer
中为雇主和学校使用相同的确切记录,则可以使用此类内容。我假设一个用户只能有一个学校和一个雇主,不再有。
class School < ActiveRecord::Base
has_many :employees, as: :employable
has_and_belongs_to_many :students, class_name: "User"
end
class Business < ActiveRecord::Base
has_many :employees, as: :employable
end
class Contract < ActiveRecord::Base #This object models the relationship between User and Employer
belongs_to :employer, as: :employable, polymorphic: true
belongs_to :user
class User < ActiveRecord::Base
has_and_belongs_to_many :schools
has_many :contracts
has_many :employers, through: :contracts
end
这会设置它,这样如果你拨打User.school
它会返回一个School对象,但如果你打电话给User.employer
,它可以根据用户指向的内容转到学校或雇主。< / p>
这使用了Polymorphic Associations。请阅读它们,因为此类关联的迁移不同。
我们使用Contract
对象的原因是has_and_belongs_to_many
关联不具有多态性,因此我们手动将其推出。如果您不喜欢has_and_belongs_to_many
或需要School
关系的更多灵活性,您可以使用像雇主这样的中间对象,可能称为Tuition
。
答案 1 :(得分:1)
要做到这一点,你将有三个模型,用户,学校和雇主。
用户belongs_to
一所学校和belongs_to
一位雇主。
学校has_many
用户。
雇主has_many
用户。
了解直接在模型中使用的这些关系,您现在知道用户将拥有school_id
和employer_id
属性。学校和雇主都不会有user_id
。
如果您决定沿着拥有并属于许多学校或雇主(has_and_belongs_to_many
)的用户的路线,那么您将需要查看关于连接表的ActiveRecord文档。