1

Railsでのnamed_scopedクエリの概念に頭を悩ませようとしています。テーブルをフィルタリングして、注目されていないアイテムのみを取得しようとしています(:featured => false)。

私のモデルに追加しました

scope:allgames、where(:featured => false)およびscope: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、コンソールでコマンドを実行すると、すべての注目のゲームの結果リストが表示されます。

ビューでこのリスト/メソッドにアクセスすることは可能ですか?

4

3 に答える 3

3

ビューは、ビューをレンダリングするコントローラーによって作成される @games インスタンス変数によって駆動されます。名前付きスコープは、ActiveRecord::Base のサブクラスのクラス メソッドを作成します。したがって、名前付きスコープを定義すると Game クラスのメソッドが作成されるため、「Game.featured」は何かを返します。Game クラス (@games など) のオブジェクトが呼び出すことができるインスタンス メソッドは作成されませんでした。そのため、「@games.featured」でエラーが発生します。

やりたいことを行うには、コントローラーで2つのインスタンス変数を作成し、それらをビューに渡します。

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

どちらの変数もビューで使用でき、ループを構築して各コレクションを好きなようにレンダリングできます。

于 2012-04-30T18:49:49.477 に答える
3

名前付きスコープはクラス メソッドとしてモデルに追加されるため、オブジェクトのコレクションでメソッドにアクセスしようとしても機能しません。同様の機能は、次の方法で実現できます。

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

ただし、コントローラーに 2 つの変数を用意することをお勧めします。

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

次に、ビューでそれらを使用します。

于 2012-04-30T18:46:46.043 に答える
0

スコープはクラス メソッド (または同化可能、詳細はわかりません) であるため、Game.featured は機能しますが、@games.featured を実行すると、インスタンスfeaturedの配列を呼び出しGameます。

于 2012-04-30T18:44:14.277 に答える