我认为这比标题可能允许的要简单得多。以下是我的三个关联模型:
更新:之前的关联不正确。以下是更正后的关联:
#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
。
结构的视觉效果如下:
所以我希望能够遍历那些关联的call_service_categories
(例如:'紧急救济','就业'),然后迭代这些call_services
的相关calls
在@call_ids
中指定,然后按服务显示这些调用。
我想出了一个级别(通过call_service),现在我只需要更深层次地找出一个级别(通过call_service_category)。
在导轨指南中,我尝试查看specifying conditions on eager loaded associations上的部分。我没有成功,但我认为答案是在那一部分。
非常感谢任何帮助。谢谢!
答案 0 :(得分:3)
其中一个belongs_to
关联(CallService
或Call
)实际上应该是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查询中)。