如何在Rails中查询多个关联表

时间:2019-03-26 14:21:33

标签: ruby-on-rails

我的应用程序中有两个关联的表,我无法弄清楚如何将它们在Rails中连接在一起,下面是我的模型:

class Lead < ApplicationRecord
    has_many :employee_leads
    has_many :employees, :through => :employee_leads
end

class EmployeeLead < ApplicationRecord
    belongs_to :employee
    belongs_to :lead
end

class Employee < ApplicationRecord
    has_many :employee_leads
    has_many :leads, :through => employee_leads
    has_many :emp_stores
    has_many :stores, :through => emp_stores
end

class EmpStore < ApplicationRecord
    belongs_to :store
    belongs_to :employee
end

class Store < ApplicationRecord
    has_many :emp_stores
    has_many :employees, :through => :emp_stores
end

我的应用程序要求我找出每个销售线索所属的商店。我知道如何将线索带给员工,这是

Lead.joins(employee_leads: :employee)

我也知道如何将员工加入商店

Employee.joins(emp_stores: :store)

这些对我来说毫无问题。当我尝试将潜在客户加入存储时,我使用了:

Lead.joins(employee_leads: :employee { emp_stores: :store })

这给了我一个语法错误,我参考Active Record的link中有关加入嵌套关联(多级)的信息,但仍然无法弄清。我对此很陌生,请有人花点时间解释并帮助我。谢谢。

1 个答案:

答案 0 :(得分:0)

尝试一下:

Lead.joins(employee_leeds: [employee: [amp_stores: :store] ])

我相信这些变体也应该起作用:

Lead.joins(employee_leeds: [{employee: [{amp_stores: :store}] }])
Lead.joins(employee_leeds: {employee: {amp_stores: :store} })

尽管如此,根据您的使用方式,您可能需要考虑使用includes而不是joins。联接是延迟加载的,而包含是快速加载的。

作为解释您的语法错误的原因……:something是一个符号。在旧的(ruby 1.9之前的)世界中,哈希键/值对的编写方式如下::key => :value。但是,从Ruby 1.9开始,提供了key: :value的较新语法。

在尝试使之工作时,您有一个键/值对,其后(没有分隔符)后面是另一个哈希。为了修复它,您只需为第一个键提供一个值:

# Old syntax
:employee_leads => [ :employee => [ :emp_stores => :store ] ]

当您考虑使用哈希的新语法时,希望可以使其更合乎逻辑:

# New syntax
employee_leads: [ employee: [ emp_stores: :store ] ]