如何在rails中使用范围来查询数据库中的信息子集并在视图中显示它?

时间:2013-04-28 14:44:07

标签: ruby-on-rails-3.2 scopes

我是初学者,我很感激答案,帮助我了解我的知识差距在哪里:

该应用是显示帖子。帖子属于一个类别(开胃菜,主菜......)我的想法是使用范围在一个视图中显示帖子上的所有开胃菜然后在另一个视图中有主菜等等。

模特:

class Post < ActiveRecord::Base
attr_accessible :body, :category_id, :title

belongs_to :category

#wrong: scope :appetizers, -> { where(post.category.name => "Appetizers")}

#corrected scope per Frederick Cheung     
scope :appetizers, ->{joins(:category).where(:categories => {:name => "Appetizers"})}
end


class Category < ActiveRecord::Base
attr_accessible :name

has_many :posts
end     

在视图中,我想循环浏览类别名称为“Appetizers”的帖子。

<table>
  <tr>
    <th>Title</th>
    <th>Body</th>
    <th>Category </th>
  </tr>

  <% @post.each do |post| %>
  <tr>
    <td><%= post.title %></td>
    <td><%= post.body %></td>
    <td><%= post.category.name%></td>
  </tr>
  <% end %>

  <%= link_to "Appetizers", appetizers_posts_path %>

 </table> 

这要求我设定路线:

  get 'posts/appetizers' => 'posts#appetizers', :as => 'appetizers_posts'

我还必须添加到帖子控制器:

 def appetizers
  @posts = Post.appetizers
   render 'index' 
 end

这让我得到了一个我想要的结果页面但是如下面评论的那样它有点乱,如果你有很多类别,它将无法很好地扩展。

我正在寻找一种更清洁的方法。任何建议都会很棒。

1 个答案:

答案 0 :(得分:1)

我发现本教程非常有用,希望它也能帮到你

http://www.jacopretorius.net/2012/02/scopes-in-rails.html

干杯