2016-05-12 75 views
2

我有一个索引视图,它遍历具有特定state_taxonomies的产品列表。我能够在视图内使用逻辑来处理查询请求,但我假设<% Product.where(id: st.product_id).each do |tax| %>逻辑不应该在视图中显示?从Ruby on Rails的视图中删除逻辑

  1. 我应该把这个逻辑放在哪里?
  2. 我应该如何创建这种方法?我尝试了几条路线但失败了。

产品索引视图用户引导NAV-丸:

<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的:产品。

+0

你的逻辑应该完全在Products控制器中。而不是** @products = Porduct..all.page params [:page] **您应该选择您需要的视图中的产品,而不是在视图级别执行此操作。 –

+0

我编辑你的问题,因为你有一个'

'没有相应的'
'。 –

+0

如有可能,如果答案对您有帮助,请给我们一个职位。如果可能,甚至选择一个最喜欢的答案。这有助于那些帮助你并通过提高答案质量来帮助本网站的人。 –

回答

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 %> 
2

你做了很多的查询,首先在您的控制器Product.all(您似乎没有使用结果)和StateTaxonomy.all。但更糟糕的是在你看来,你为每个@state_taxonomies做了Product.where(id: st.product_id)

你应该研究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

+0

伟大的解决方案。比我的好。 –

+0

随着你的建议,我得到这些结果'未初始化的恒定StateTaxonomy :: Products' – jgrant

+0

@jgrant我写得有点太快了,我编辑了控制器行。 – igwan