【问题标题】:Rails has_many through with has_one or belongs_toRails has_many 通过 has_one 或 belongs_to
【发布时间】:2019-09-12 19:33:08
【问题描述】:

我有 3 个模型:Company、Portable 和 Jobsite。我希望能够致电company.portablescompany.jobsitesportable.companyportable.jobsitejobsite.portablesjobsite.company。我已经像这样设置了我的关联:

class Company
  has_many :portables
  has_many :jobsites, through: :portables
end

class Portable
  belongs_to :company
  belongs_to :jobsite
end

class Jobsite
  has_many :portables
  has_one  :company, through: :portables
end

除了jobsite.company,我可以成功调用所有的东西。当我拨打这个电话时,我得到:

ActiveRecord::HasOneThroughCantAssociateThroughCollection: Cannot have a has_one :through association 'Jobsite#company' where the :through association 'Jobsite#portables' is a collection. Specify a has_one or belongs_to association in the :through option instead.

设置这些关联的正确方法是什么?我是否必须在工作现场将工作现场添加到公司协会belongs_to :company 并将工作现场_id 添加到公司?似乎应该有另一种方法可以用我已经设置的方法来实现这一点。

【问题讨论】:

    标签: ruby-on-rails rails-activerecord active-record-query


    【解决方案1】:

    如果您考虑一下,所描述的架构将无法正常工作。如果你真的希望 Jobsite 只有一个 Company,那么它不能通过 Portable,因为 Jobsite 有很多 Portable。

    所以你有两个选择: - 如果您的意思是一个 Jobsite 应该有一个“主要”公司,那么直接有一个 Jobsite has_one :company,没有 :through 部分。 - 如果您的意思是 Jobsites 真的可以通过他们的许多便携式设备拥有许多公司,那么只需将您的代码更改为 have_many:

    奖励选择,您还可以通过执行以下操作来了解此处的选项:

    has_one :company, -> {where(primary: true)}
    

    你可以用这种方式做各种花哨的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      相关资源
      最近更新 更多