2012-04-30 6 views
1

私はrailでnamed_scopedのクエリの概念を頭に入れようとしています。 テーブルをフィルタリングして、非特典アイテム(:featured => false)のみを取得しようとしています。私はリストにしようとしている機能を備えた、(特集=>真)Railsとnamed_scopeのクエリ

: と スコープ:(=>偽の特色)allgamesを、:私は

範囲を追加している私のモデルでは

すべてのフィーチャーとノンフィーチャーアイテムを私のゲームインデックスページに別々に表示します。

名前付きスコープで可能ですか?

これまでのところ、私が持っている:

<% @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を実行すると、すべてのおすすめゲームの結果リストが表示されます。

ビュー内でこのリスト/メソッドにアクセスできますか?

答えて

3

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

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

しかし、私はあなたのコントローラで2つの変数を持つ推薦:

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

は、あなたの意見のものを使用しています。

+0

私はコントローラでそれを試したところ、正常に動作します。ちょうどそれが正面視線に邪魔されることなくアクセスできると思った。とにかく、それはちょうど素晴らしいです。あなたの助けをありがとう –

+0

ビューでこれを直接行うには、コントローラでインスタンス変数を設定するのではなく、ビューでGames.featuredを使用します。 <%Games.featured.each do | item | %> –

+0

データアクセスの適切な場所はコントローラ内です。ビューやヘルパーでActiveRecordを見つけることはできますが、これはお勧めできません。 –

0

スコープはクラスメソッドです(具体的なことはわかりません)ので、Game.featuredは機能しますが、@ games.featuredを実行すると、配列のfeaturedが呼び出されますGameインスタンス。

3

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

あなたがしたいことをするには、コントローラに2つのインスタンス変数を作成し、それらをビューに渡します。

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

どちらの変数もビューに表示され、好きなように各コレクションをレンダリングするループを作成できます。

+1

あなた、同時投稿! –