Rails和named_scope查询

时间:2012-04-30 18:41:01

标签: sql ruby-on-rails scope

我试图了解rails中的named_scoped查询的概念。 我正在尝试过滤表格以仅获取非特色商品(:featured => false)。

在我的模特中,我添加了

范围:allgames,where(:featured => false) 和 范围:特色,其中(特色=>真)

我正在尝试在我的游戏索引页面上单独列出所有特色和非特色项目。

是否可以通过命名范围进行。

到目前为止,我有:

<% @games.each do |item| %>
  <% if item.featured %> 
    <%= render 'application/item_synopsis_builder', item: item %>
  <% end -%>
<% end %>

我想知道是否有可能做类似的事情:

<% @games.featured.each do |item| %>
    <%= render 'application/item_synopsis_builder', item: item %>
<% end %>

<%= render partial: 'application/item_synopsis_builder', collection: @games.featured %>

当我尝试时,我收到一条消息,说没有特色方法。 但是当我在控制台中运行命令Game.featured时,我会得到所有特色游戏的结果列表。

是否可以在视图中访问此列表/方法?

3 个答案:

答案 0 :(得分:3)

命名范围作为类方法添加到模型中,因此尝试访问对象集合上的方法将不起作用。使用以下方法可以实现类似的功能:

    @games.where(:featured => true).each do 
       ...
    end

但我建议您在控制器中使用两个变量:

    @featured_games = Games.featured
    @all_games      = Games.allgames

然后在你的观点中使用它们。

答案 1 :(得分:3)

您的视图由呈现视图的控制器创建的@games实例变量驱动。命名范围为ActiveRecord :: Base的子类创建一个类方法。所以“Game.featured”会返回一些东西,因为定义命名范围会为Game类创建一个方法。它确实创建一个实例方法,Game类的对象(如@games)可以调用它。这就是“@ games.featured”给你一个错误的原因。

要做你想做的事,在控制器中创建两个实例变量并将它们传递给视图,例如

@all_games = Game.allgames
@featured_games = Game.featured

这两个变量都可供您的视图使用,您可以根据需要构建循环来渲染每个集合。

答案 2 :(得分:0)

范围是一种类方法(或者可以同化,我不知道具体细节),所以是的,Game.featured会起作用,但当你做@ games.featured时,你正在调用featured一组Game个实例。