繁体   English   中英

Rails和named_scope查询

[英]Rails and named_scope queries

我试图让我了解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时,我会得到所有特色游戏的结果列表。

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

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

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

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

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

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

您的视图由@games实例变量驱动,该实例变量由呈现视图的控制器创建。 命名范围为ActiveRecord :: Base的子类创建一个类方法。 因此,“ Game.featured”返回了一些信息,因为定义命名范围为Game类创建了一个方法。 没有创造游戏类(如@games)的那个对象的实例方法可以调用。 这就是为什么“ @ games.featured”给您一个错误的原因。

要执行您想做的事情,请在控制器中创建两个实例变量,然后将它们传递给视图,例如

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

这两个变量都可以在您的视图中使用,并且您可以构造循环以根据需要渲染每个集合。

作用域是一个类的方法(或同化到,我不知道具体情况),所以是的,Game.featured会的工作,但是当你做@ games.featured,您呼叫featured的阵列上Game的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM