Sql Rails和命名范围查询

Sql Rails和命名范围查询,sql,ruby-on-rails,scope,Sql,Ruby On Rails,Scope,我试图了解rails中命名范围查询的概念。 我正在尝试筛选一个表,以仅获取非特色项目(:特色=>false) 在我的模型中,我添加了 范围:所有游戏,其中(:featured=>false) 和 范围:精选,其中(精选=>true) 我试图在我的游戏索引页面上分别列出所有特色和非特色项目 是否可以通过命名的作用域访问它 到目前为止,我已经: <% @games.each do |item| %> <% if item.featured %> <%= r

我试图了解rails中命名范围查询的概念。 我正在尝试筛选一个表,以仅获取非特色项目(:特色=>false)

在我的模型中,我添加了

范围:所有游戏,其中(:featured=>false) 和 范围:精选,其中(精选=>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 %>


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


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

作用域是一个类方法(或可与之类似,我不知道具体情况),因此可以使用Game.featured,但当您使用@games.featured时,您正在调用
featured
一组
游戏
实例。

作用域是一个类方法(或与之相似,我不知道具体情况),是的,Game.featured可以工作,但是当您执行@games.featured时,您正在调用
featured
一系列
Game
实例。

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

    @games.where(:featured => true).each do 
       ...
    end
但我建议在控制器中设置两个变量:

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

然后在视图中使用它们。

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

    @games.where(:featured => true).each do 
       ...
    end
但我建议在控制器中设置两个变量:

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

然后在视图中使用它们。

视图由呈现视图的控制器创建的@games实例变量驱动。命名作用域为ActiveRecord::Base的子类创建类方法。因此“Game.featured”返回某些内容,因为定义命名作用域为游戏类创建了一个方法。它没有创建游戏类对象(如@games)可以调用的实例方法。这就是“@games.featured”导致错误的原因

要执行您想要执行的操作,请在控制器中创建两个实例变量并将它们传递给视图,例如

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

这两个变量对您的视图都是可用的,您可以构造循环来呈现您喜欢的每个集合。

您的视图由呈现视图的控制器创建的@games实例变量驱动。命名作用域为ActiveRecord::Base的子类创建类方法。因此“Game.featured”返回某些内容,因为定义命名作用域为游戏类创建了一个方法。它没有创建游戏类对象(如@games)可以调用的实例方法。这就是“@games.featured”导致错误的原因

要执行您想要执行的操作,请在控制器中创建两个实例变量并将它们传递给视图,例如

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

这两个变量都可用于您的视图,并且您可以构造循环来呈现每个集合,无论您喜欢什么。

该死的,同步发布!该死的,同步发布!Yop我刚刚在控制器中尝试过,效果很好。只是认为可以从视图的正前方访问它。无论如何,这太棒了。谢谢r您的帮助要直接在视图中执行此操作,请使用视图中的Games.featured,而不是在控制器中设置实例变量。数据访问的正确位置在控制器中。虽然您可以在视图或帮助中执行ActiveRecord查找,但不推荐这样做。Yop我只是在控制器中尝试了一下,效果很好。我还以为是这样可以从视图的正前方访问它。无论如何,这太棒了。感谢您的帮助要直接在视图中执行此操作,请使用视图中的Games.featured,而不是在控制器中设置实例变量。数据访问的正确位置在控制器中。虽然您可以在视图或帮助中执行ActiveRecord查找,但不建议使用结束了。