1

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

在我的模型中,我添加了

范围 :allgames, where(:featured => false) 和范围 :featured, where(featured => true)

我试图在我的游戏索引页面上分别列出所有特色和非特色项目。

是否可以通过命名范围来实现它。

到目前为止,我有:

<% @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在控制台中运行命令时,我会得到所有特色游戏的结果列表。

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

4

3 回答 3

3

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

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

但我建议您的控制器中有两个变量:

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

然后在您的视图中使用它们。

于 2012-04-30T18:46:46.043 回答
3

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

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

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

这两个变量都将在您的视图中可用,并且您可以构建循环来呈现您喜欢的每个集合。

于 2012-04-30T18:49:49.477 回答
0

范围是一个类方法(或可同化,我不知道具体细节),所以是的,Game.featured 可以工作,但是当您执行 @games.featured 时,您正在调用一个实例featured数组。Game

于 2012-04-30T18:44:14.277 回答