【问题标题】:Rails and named_scope queriesRails 和 named_scope 查询
【发布时间】:2012-04-30 18:41:01
【问题描述】:

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

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

【问题讨论】:

    标签: sql ruby-on-rails scope


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 是的,我刚刚在控制器中尝试过,它工作正常。只是认为可以直接从正面访问它。无论如何,这太棒了。感谢您的帮助
    • 要直接在视图中执行此操作,请在视图中使用 Games.featured,而不是在控制器中设置实例变量。
    • 数据访问的正确位置是在控制器中。虽然您可以在视图或助手中进行 ActiveRecord 查找,但不建议这样做。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 该死的,同步发帖!
    【解决方案3】:

    作用域是一个类方法(或者可以同化,我不知道具体细节),所以是的,Game.featured 可以工作,但是当你使用@games.featured 时,你是在数组上调用featured Game 个实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多