这就是我的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 所有属于此类别的网页上显示?
答案 0 :(得分:2)
您应该使用类别模型调用页面assosication,
<%= @category.name %>
<h1> PAGES </h1>
<table>
<tr>
<% @category.pages.each do |page| %>
<td> <%= page.title %> </td>
<td> <%= page.content %> </td>
<% end %>
</tr>
</table>
&#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)
主要取决于您在category
和page
之间建立关系的方式。通过我的代码可以看到,你可以做这样的事情。
@pages = Page.where(:category_id => 1)
<强>更新强>
根据您的关系
@pages = @category.pages