【问题标题】:Object with more than one Model (Rails)具有多个模型的对象(Rails)
【发布时间】:2015-05-08 01:12:10
【问题描述】:

背景: 我在概念上考虑如何引用可以属于多个模型的单个对象。例如,如果我有一个学校和雇主模型——用户理论上可以在同一所学校上学并受雇。理想情况下,两个关系都指向同一个对象。

问题: 我将如何在基于 postgresql 的 Rails 应用程序中对其建模?

更新 在这种情况下,我需要一个用户能够同时拥有一所或多所学校和一个或多个雇主。

【问题讨论】:

  • 不是 Rails 人,但您不会有一个具有两个属性的用户模型,并且都是学校模型吗?
  • 学校和雇主有什么关系?
  • @sean 在我看来,它们没有关系,除了一个对象可以同时是学校和雇主。

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 model


【解决方案1】:

编辑:反映问题是关于 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,它可能会转到 School 或 Employer,具体取决于用户指向的内容。

这利用了Polymorphic Associations。请阅读它们,因为这种关联的迁移是不同的。

我们使用Contract 对象的原因是has_and_belongs_to_many 关联不能是多态的,所以我们手动推出它。如果您不喜欢 has_and_belongs_to_many 或需要更多灵活性来处理 School 关系,您可以使用像雇主这样的中介对象,可能称为 Tuition

【讨论】:

  • 我要添加的唯一补充是考虑没有学校或没有雇主的用户的情况。
  • 这种情况根本不会改变所需的代码吗?雇主和学校都是零,就是这样
  • 抱歉没有指定 - 在这种情况下,我需要一个用户能够同时拥有一所或多所学校和一个或多个雇主
  • @neon 现在检查一下,这应该对您有所帮助。请注意,我的代码可能无法开箱即用,我是手工编写的,没有经过测试。更多的是为你指明前进的方向
【解决方案2】:

为此,您需要三个模型,用户、学校和雇主。

用户belongs_to一个学校和belongs_to一个雇主。 学校has_many 用户。 雇主has_many 用户。

了解了这些直接在模型中使用的关系,您现在知道 User 将具有 school_idemployer_id 属性。学校和雇主都没有user_id

如果您决定采用拥有并属于许多学校或雇主 (has_and_belongs_to_many) 的用户的路线,那么您将需要查看有关联接表的 ActiveRecord 文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 2013-09-24
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多