2012-04-30 76 views
1

我試圖讓我的頭繞着rails的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 

但我會建議在你的控制器有兩個變量:

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

然後使用這些在你的意見。

+0

喲我只是試圖在控制器中,它工作正常。只是認爲有可能訪問它直視前方。無論如何,這真是太棒了。感謝您的幫助 –

+0

要直接在視圖中執行此操作,請在視圖中使用Games.featured,而不是在控制器中設置實例變量。 <%Games.featured.each do | item | %> –

+0

數據訪問的適當位置在控制器中。雖然你可以在視圖或幫助程序中執行ActiveRecord查找,但不推薦使用它。 –

0

作用域是一個類方法(或可同化,我不知道具體情況),所以是的,Game.featured可以工作,但是當您執行@ games.featured時,您正在調用featuredGame實例。

3

您的視圖是由呈現視圖的控制器創建的@games實例變量驅動的。命名範圍爲ActiveRecord :: Base的子類創建一個類方法。所以「Game.featured」會返回一些內容,因爲定義命名範圍爲Game類創建了一個方法。它沒有而不是創建一個Game類的對象(例如@games)可以調用的實例方法。這就是爲什麼「@ games.featured」會給你一個錯誤。

要做你想做的事情,在控制器中創建兩個實例變量並將它們傳遞給視圖,例如,

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

兩個變量將提供給你的看法,你可以構建循環,從而使得各但是你喜歡收藏。

+1

該死的你,同時發帖! –