渴望加载与条件的嵌套关联

时间:2015-10-29 22:04:56

标签: ruby-on-rails ruby activerecord rails-activerecord

我认为这比标题可能允许的要简单得多。以下是我的三个关联模型:

更新:之前的关联不正确。以下是更正后的关联:

#app/models/call_service.category.rb
class CallServiceCategory < ActiveRecord::Base
  has_many :call_services
end

#app/models/call_service.rb
class CallService < ActiveRecord::Base
  belongs_to :call_service_category
  has_many :calls
end

#app/models/call.rb
class Call < ActiveRecord::Base
  belongs_to :call_service
end

所以我有一组call_ids用于我想要的调用:

@call_ids = [1,2,3,4]

有效的初步步骤
我想要做的是只使用calls中指定的ID获取@call_ids。然后,我希望只为加载的call_services加载关联的calls。以下是完美的:

@call_ids = [1,2,3,4]
@calls_by_service = CallService.includes(:calls).where("calls.id IN (?)", @call_ids).references(:calls)

这很棒。现在我只能遍历那些选定的呼叫'call_services,我甚至可以列出所有这些选定的呼叫,如下所示:

<% @calls_by_service.each do |call_service| %>
  <p> <%= call_service.description %> </p>
  <% call_service.calls.each do |call| %>
    <%= call.name %><br>
  <% end %>
<% end %>

同样有用的是,@calls_by_service不包含所有call_services,而只包含与call_service中指定的calls相关联的@call_ids条记录1}}。正是我想要的水平。

我遇到麻烦的一级深度:
这很好,但我需要深入一级:我想只显示call_service_categories指定的call_services所关联calls的关联@call_ids

换句话说:我想只使用calls中指定的ID抓取@call_ids。然后:我希望只为那些抓取的call_services加载关联的calls。然后:我想急切加载那些抓取call_service_categories的关联calls

结构的视觉效果如下:

example

所以我希望能够遍历那些关联的call_service_categories(例如:'紧急救济','就业'),然后迭代这些call_services的相关calls@call_ids中指定,然后按服务显示这些调用。

我想出了一个级别(通过call_service),现在我只需要更深层次地找出一个级别(通过call_service_category)。

在导轨指南中,我尝试查看specifying conditions on eager loaded associations上的部分。我没有成功,但我认为答案是在那一部分。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:3)

其中一个belongs_to关联(CallServiceCall)实际上应该是has_one(一对一的关系 - belongs_to一边是has_one而另一边是left join。除此之外,您可以尝试使用以下代码生成带有CallServiceCategory.includes(call_services: :calls) .where(calls: {id: @call_ids}) .references(:call_services, :calls) 的链式查询,并从所有3个表中检索字段:

through

我注意到您的CallServiceCategory模型上有:call_services个关联,但由于includes中没有CallService,您无法引用字段来自references中的{{1}}模型(你可以,但它们不会出现在实际的sql查询中)。