我试图了解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
时,我会得到所有特色游戏的结果列表。
是否可以在视图中访问此列表/方法?
答案 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
个实例。