2011-08-31 91 views
1

我想在我的User模型中有一個稱爲feed的方法,它返回兩個表(討論,交換)中的所有條目。如何在ruby方法中編寫SQL?

在User.rb

def feed 
    SELECT * FROM discussions, exchanges GROUP BY created_at 
end 

這是不行的,我得到了鐵軌控制檯問題

syntax error, unexpected ';', expecting '=' 

誰能告訴我怎麼寫SQL語句會在這裏?基本上我想返回,並從兩個不同的表進行排序項..

+0

您需要提供表字段,以便能夠寫出正確的SQL聲明。 – Andrey

回答

2

如果你想實際ActiveRecord對象,你可以試試下面的

def feed 
    exchanges = Exchange.all 
    discussions = Discussion.all 

    (exchanges + discussions).sort! { |a, b| a.created_at <=> b.created_at } 
end 

這是相當無效的,因爲排序可以在SQL中完成,但ActiveRecord無法實例化從不同表格中選擇的記錄(您可以用某種方法通過使用STI覆蓋此項)

+0

謝謝 - 祝你有個美好的一天 – jay

2

首先,您不能只在您的ruby代碼中編寫普通SQL,並期望它能夠工作。

這是ruby,而不是SQL。他們是不同的語言。 如果可以的話 - 使用ruby-way和關聯來代替(按照另一個例子)。但是 - 如果你迫切需要使用原始SQL(例如,你的legavy表與模型不匹配,或者在SQL中有一些複雜的組合邏輯,不容易映射到關聯)。那麼你需要傳遞SQL到數據庫......這意味着使用通過Active Record的連接。

嘗試:

def feed 
    ActiveRecord::Base.connection.execute("SELECT * FROM discussions, exchanges GROUP BY created_at") 
end 

它不會給你回款的紅寶石 - 只是一個原始結果對象。 我建議在腳本/控制檯中嘗試一下,然後執行「puts my_user.feed.inspect」來查看它返回的類型,以便知道如何使用它。

注:這種東西的存在被認爲是一個強大的代碼味道 - 只使用它,你真的需要它

+0

:)然而你在你的代碼中試過了...... 這就是爲什麼我回答並解釋了爲什麼它不能這樣工作 –

相關問題