从Ruby on Rails中的视图中删除逻辑

时间:2016-05-12 22:24:16

标签: ruby-on-rails

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

  1. 我应该把这个逻辑放在哪里?
  2. 我应该如何创建此方法?我尝试过几条路线却失败了。
  3. 产品索引视图用户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。

2 个答案:

答案 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 %>