rails显示每个类别的内容

时间:2016-02-18 07:12:21

标签: ruby-on-rails

这就是我的CategoriesController的样子:

class CategoriesController < ApplicationController

  def index     
    @categories = Category.all
  end

  def show
    @category = Category.find(params[:id])          
  end   

end

在我的show.html.erb中我写了这个来显示类别名称:

<h2><%= @category.name %></h2>

我还有一个PagesController,我与类别的关系 我有几个分配给类别的页面(例如category_id:1)
当我点击主页上的类别链接时:

<%= link_to "category", category_path(cat) %>

进入显示页面很好

如何在我点击的show.html.erb 所有属于此类别的网页上显示

3 个答案:

答案 0 :(得分:2)

您应该使用类别模型调用页面assosication,

&#13;
&#13;
<%= @category.name %>
<h1> PAGES </h1>
<table>
  <tr>
    <% @category.pages.each do |page| %>
      <td> <%= page.title %> </td>
      <td> <%= page.content %> </td>
   <% end %>
  </tr>
</table>
&#13;
&#13;
&#13;

这会为你做。

答案 1 :(得分:2)

您应该使用includes来提高应用程序的性能。它还会从pages返回所有预期的记录,而不会再次触发数据库查询。 ERB中的@category.pages不会进行数据库查询。因此,您将拥有高效的代码。

在你的节目动作中:

def show
  @category = Category.find(params[:id]).includes(:pages)
end

show.html.erb

<%= "Category: #{@category.name}" %>
<h1> POSTS </h1>
<table>
  <tr>
    <% @category.pages.each do |page| %>
      <td> <%= page.field1 %> </td>
      <td> <%= page.field2 %> </td>
    <% end %>
  </tr>
</table>

Rich Peck编辑

通常,ActiveRecord会执行名为lazy loading的操作,这意味着它只会在需要时执行数据库查询。这通常是高效的;不幸的是,当您调用关联数据时会出现问题。

调用@category.pages时,您会收到n+1 issue,这意味着每次调用Category.find查询时,都会使用额外的查询加载pages

  

上述代码只执行2次查询,而不是前一种情况下的11次查询:

SELECT * FROM clients LIMIT 10
SELECT addresses.* FROM addresses
  WHERE (addresses.client_id IN (1,2,3,4,5,6,7,8,9,10))

因此,使用.includes基本上会将pages添加到您的@category,这比让它懒得加载更有效率。

答案 2 :(得分:0)

主要取决于您在categorypage之间建立关系的方式。通过我的代码可以看到,你可以做这样的事情。

@pages = Page.where(:category_id => 1)

<强>更新

根据您的关系

@pages = @category.pages