2012-10-07 25 views
2

我有一個包含多個「源」的頁面。在我的控制器我有這樣的事情:Rails:從多個模型創建「所有活動源」

def index 

@plays = current_user.plays.includes(:game).order("created_at desc") 

@wants = current_user.wants.includes(:game).order("created_at desc") 

@ratings = current_user.ratings.includes(:game).order("created_at desc") 

end 

我用這樣的代碼視圖:

<% @plays.each do |play| %> 
      You played <%= play.game.name %></p> 
    <% end %> 

現在我想打一個,即「所有活動」頁面上來回飼料其中按照創建日期(desc)排序,在一個Feed中顯示Plays,Wants和Ratings。

任何幫助最好的方式來做到這一點會很好。

更新:如從每個模型請求的代碼,簡單好用的現在:

class Play < ActiveRecord::Base 
    attr_accessible :game_id, :user_id, :description 

    belongs_to :user 
    belongs_to :game 

end 

class Rating < ActiveRecord::Base 

    attr_accessible :game_id, :id, :score, :user_id, :description 

    belongs_to :user 
    belongs_to :game 


end 

class Want < ActiveRecord::Base 
    attr_accessible :game_id, :user_id, :description 

    belongs_to :user 
    belongs_to :game 


end 
+0

您能告訴我們如何在用戶模型中定義戲劇,想要和評分方法嗎?它們是完全獨立的連接模型,範圍,自定義關聯方法嗎? –

+0

@PeterDuijnstee更新了型號代碼 –

回答

2

因爲這些來自不同的表,你將無法在數據庫中查詢排序。但既然你已經有了每個陣列,你可以使用Ruby組合和排序:

@activities = (@plays + @wants + @ratings).sort_by {|a| a.created_at}.reverse 
+0

嘿,謝謝你的回答。當我這樣做時,我得到「比賽與比賽失敗」任何想法? –

+0

我改變了上面的答案使用sort_by,這將消除此錯誤。 –

+0

現在我得到了:未定義的方法'to_datetime'爲零:NilClass道歉,我對rails很新。任何幫助都會很棒! –

0

我能想到的兩種方法可以做到這一點,快速和簡單的方式和重構的方式。

快速簡單的方法是從三者中的每一箇中構建所有結果的數組,然後按日期對其進行排序。所以,你可以有類似:

@items = [] << @plays << @wants << @ratings 
@items.sort_by { |item| item.created_at } 

然後你的視圖代碼可以問每一個項目是什麼同級車是要弄清楚要使用的文本。

重構的方式將注意到,您的3個類幾乎是相同的 - 事實上,除名稱外,Play和Want是相同的,而Rating僅添加單個列。因此,爲所有3添加一個超類。您可能需要進行巧妙的遷移,以使用STI將數據庫表合併到單個表中,但它可能是更好的長期解決方案。

+0

感謝您的回答,我認爲我會建立超級課程,但現在我只是試圖建立一個快速和骯髒的原型。我在上面的代碼中遇到了一些問題。這是我得到的:語法錯誤,意外'|',期待')' @ items.sort_by(| item | item.created_at) –

+0

哎呀,需要使用{}而不是(),因爲我傳遞一個要sort_by的塊,現在已修復。無論如何,代碼只是爲了說明我的想法,並保證是越野車。 :) – dpassage

相關問題