Ruby on rails 带条件的即时加载嵌套关联
我认为这比标题可能透露的要简单得多。以下是我的三个关联模型:Ruby on rails 带条件的即时加载嵌套关联,ruby-on-rails,ruby,activerecord,rails-activerecord,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_cate
#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
更新:以前关联不正确。以下是更正后的关联:
#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
有效的初始步骤:我要做的是只抓取
调用
,其ID在@call\u ids
中指定。然后,我只想为那些被抓取的呼叫加载相关的call\u服务
。以下内容可以很好地做到这一点:
@call_ids = [1,2,3,4]
@calls_by_service = CallService.includes(:calls).where("calls.id IN (?)", @call_ids).references(:calls)
这太棒了。现在,我可以只遍历那些选定的调用“call\u 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\u by_service
并不包含所有的call\u服务
,而是只包含那些与@call\u id
中指定的calls\u服务
相关联的记录。这正是我想要的
更深一层,我遇到了麻烦:
这很好,但我需要更深入一层:我只想显示由@call\u id
指定的那些所选呼叫的相关呼叫服务的相关呼叫服务类别
换句话说:我只想抓取@call\u ids
中指定ID的调用。然后:我只想为那些被抓取的呼叫加载相关的呼叫服务
。然后:我只想为那些被抓取的呼叫加载相关的呼叫服务\u类别
结构的视觉效果如下所示:
因此,我希望能够遍历那些相关的呼叫服务类别
(例如:“紧急救援”、“就业”),然后遍历那些@call\u id
中指定的呼叫的相关呼叫服务
,然后显示每个服务的呼叫
我算出了一个级别(通过呼叫服务),现在我只需要算出更深的一个级别(通过呼叫服务类别)
在rails指南中,我尝试查看上的部分。我没有成功,但我认为答案就在那一部分
非常感谢您的帮助。谢谢 其中一个属于
关联(在呼叫服务
或呼叫
中)实际上应该是一个有一个
(一对一关系–一方属于
,另一方有一个
)。除此之外,您还可以尝试使用以下代码生成带有left join
s的链式查询,并从所有3个表中检索字段:
CallServiceCategory.includes(call_services: :calls)
.where(calls: {id: @call_ids})
.references(:call_services, :calls)
我注意到您在CallServiceCategory
模型上有一个到的关联,但是由于没有:在包含中调用服务,您不能在引用中引用CallService
模型中的字段(可以,但它们不会出现在实际的sql查询中).你试过这样的方法吗:CallServiceCategory.includes(call\u services::calls)。where(calls:{id:@call\u ids})。references(:call\u services,:calls)
?顺便问一下,没有的情况下,你如何调用calls
呢?@potashin拼写错误。我会纠正这些关系,我会试试你的建议。属于
协会(在呼叫服务
或呼叫
)中的一个应该是一个有一个
(一对一关系–一方属于
,另一方属于
),看来我的编辑被拒绝了,所以你必须自己进行编辑。答案中应该有一个s
:call
上的s
:call
,包括(call\u services::calls)
。一旦更新,我将接受你的回答。谢谢