Sql Rails和命名范围查询
我试图了解rails中命名范围查询的概念。 我正在尝试筛选一个表,以仅获取非特色项目(:特色=>false) 在我的模型中,我添加了 范围:所有游戏,其中(:featured=>false) 和 范围:精选,其中(精选=>true) 我试图在我的游戏索引页面上分别列出所有特色和非特色项目 是否可以通过命名的作用域访问它 到目前为止,我已经: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
<% @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查找,但不建议使用结束了。