我有一个索引视图,它遍历具有特定state_taxonomies的产品列表。我能够在视图中使用逻辑来处理查询请求,但我假设<% Product.where(id: st.product_id).each do |tax| %>
逻辑不应该在视图中显示?
产品索引视图用户Bootstrap nav-pills:
<div>
<% @state_taxonomies.each do |st| %>
<div class="tab-pane" id="<%= st.id %>">
<% Product.where(id: st.product_id).each do |tax| %>
<%= link_to tax.title, tax %>
<% end %>
</div>
<% end %>
</div>
产品控制器:
def index
@products = Product.all.page params[:page]
@state_taxonomies = StateTaxonomy.all
end
注意:产品has_many:state_taxonomies和state_taxonomy belongs_to:product。
答案 0 :(得分:2)
您正在执行大量查询,首先在您的控制器中Product.all
(您似乎不使用结果)和StateTaxonomy.all
。但更糟糕的是,您认为每个Product.where(id: st.product_id)
都会@state_taxonomies
。
你应该研究n + 1问题和eager loading。此外,永远不要在视图中进行查询,也不要在控制器中进行查询。
您需要的是在控制器中查询StateTaxonomy时包含产品:
@state_taxonomies = StateTaxonomy.all.includes(:product)
然后在你看来:
<% @state_taxonomies.each do |st| %>
<div class="tab-pane" id="<%= st.id %>">
<% st.products.each do |tax| %>
<%= link_to tax.title, tax %>
<% end %>
</div>
<% end %>
编辑: 我刚刚意识到视图无法以这种方式工作。在您的模型中,state_taxonomy属于产品,因此它只能有一个产品。我不知道这是你想要的还是错误的。
您可以按州state_taxonomy显示一个产品:
<% @state_taxonomies.each do |st| %>
<div class="tab-pane" id="<%= st.id %>">
<%= link_to st.product.title, st.product %>
</div>
<% end %>
或更改两个模型之间的关系,也许你想要has_and_belongs_to_many
。
答案 1 :(得分:0)
您的产品控制器应该是这样的:
def index
@state_taxonomies = StateTaxonomy.all
@products = Hash.new
@state_taxonomies.each |st| do
@products[st.id] == Product.where(id: st.product_id)
end
end
这将在@products中存储您视图中所需的所有内容,您只能写:
<% @state_taxonomies.each do |st| %>
<div class="tab-pane" id="<%= st.id %>">
<% @products[st.id].each do |tax| %>
<%= link_to tax.title, tax %>
<% end %>
</div>
<% end %>