我希望有一个多维哈希,给定一个连接4个相关表的查询。
主要是我希望这个服务于我有三个级别信息的屏幕。当我点击Process时,我得到一个包含活动的表格,当点击活动时,得到一个包含pollution_origins和sub_pollution_origins的表格。
所以,我有5个模型,其中一个是关系型(process_model_maps),它连接其他四个。
它们之间存在层次结构(sub_pollution_origin_models位于pollution_origin_models内,它们位于activity_models内部,是至少一个process_model的一部分)
目前我有这个:
_process_models_maps_list.html.erb
<table id="all_processes">
<tbody>
<% @process_models.each do |process_model| %>
<tr class="process_line_color"> <td><%= process_model.name %></td> </tr>
<tr>
<%= render partial: "process_activities",
locals: { process_model: process_model} %>
</tr>
<% end %>
</tbody>
</table>
_process_activities.html.erb
<table id = "process_activities">
<tbody>
<% process_model.activity_models.each do |activity_model| %>
<tr class="activity_line_color"> <td><%= activity_model.name %></td> </tr>
<tr>
<%= render partial: "activity_sub_pollution_origin_models",
locals: { activity_model: activity_model} %>
</tr> <!-- row activity_model details-->
<% end %>
</tbody>
</table>
_activity_sub_pollution_origin_models.html.erb
<table id = "activity_details">
<tbody>
<% activity_model.process_model_maps.each do |process_model_map| %>
<tr>
<td> <%= process_model_map.pollution_origin_model.name %></td>
<td> <%= process_model_map.sub_pollution_origin_model.name %> </td>
</tr>
<% end %>
</tbody>
</table>
问题在于,如果我只使用常规的activerecord,rails会继续运行并设置大量查询,从而导致屏幕性能下降。
所以我认为如果我以某种方式预先加载了哈希,这将使最终用户的任务变得更容易。
在我的 ProcessModel.rb 我有
def self.get_tree_map
joins(process_model_maps: [:activity_model, :pollution_origin_model, :sub_pollution_origin_model]).select("process_models.id, process_models.name, activity_models.id,activity_models.name, process_model_maps.id , pollution_origin_models.name,sub_pollution_origin_models.name")
end
我现在正想着得到类似的东西:
{Project_id: 1, name: Fundicao, {activity_id:1, name: Decapagem,{process_model_maps_id: 2, pollution_origin_models_id: 1, pollution_origin_models_name: " Energia ", sub_pollution_origin_models_id: 1, sub_pollution_origin_models_name: "Energia Eletrica" },...}}}
答案 0 :(得分:0)
在您的控制器中:
@process_models = Process.all.joins(:activities).merge(
Activity.joins(:pollution_origins))
这应该通过单个SQL调用获取所需的所有数据。