2010-12-10 40 views
0

我已經建立了模型,但我不知道如何寫在控制器代碼即可獲得下面的SQL查詢的結果..ROR:MySQL查詢表達式

SELECT users.name, events.* FROM users, events WHERE users.id=events.uid 

非常感謝。

我重新命名events.uid - > events.user_id
併成立了二者的模型,事件中的屬性

t.integer :user_id 
    t.string :title 
    t.datetime :hold_time 
    t.string :place 
    t.text :description 

而且新的錯誤是
undefined method title for #<User:0x3fb04d8>

對不起打擾你們..

+0

Jeff Paquette的回答非常正確。至少您應該閱讀以下兩組文檔:http://guides.rubyonrails.org/active_record_querying.html和 http://guides.rubyonrails.org/association_basics.html – Swanand 2010-12-10 03:44:55

+0

title是Event的屬性,而不是用戶。你正在用戶對象上調用它。 – 2010-12-10 17:54:40

+0

好的,我在查看頁面時做錯了。我應該使用「<%= e.events.title%>」而不是「<%= e.title%>」。謝謝你的幫助。 – Niao 2010-12-10 18:54:28

回答

1

假設你已經設置了associations你應該可以這樣做:

u = Users.find(:all, :include => :events, :conditions => "users.id == events.uid") 
+0

我爲「belongs_to:users」設置了「has_many:events」的用戶模型和事件模型。但它顯示錯誤msg =>未定義的方法`eq'爲零:NilClass。爲什麼? – Niao 2010-12-10 03:45:35

0

我不能發表評論,但(沒有足夠的代表),所以我張貼的答案,但:

"users.id == events.uid" 

應該是:

"users.id = events.uid" 

我不知道那會解決你的問題,但它可能。

,如果你想找到的所有用戶和事件,你可以做這樣的:

users = User.all 
users.each do |user| 
    = user.name 
    user.events.each do |event| 
    = event.name 
    end 
end 

和你的模型是這樣的:

class User < ActiveRecord::Base 
    has_many :events 
end 

class Event < ActiveRecord::Base 
    belongs_to :user 
end 

我肯定有另一種方式用event.uid做,但我還沒有那麼先進。

0

可以使用find_by_sql函數來執行任意SQL,所以你的情況,你可以這樣做:

e = Event.find_by_sql('SELECT events.*, users.name as user_name from users, events where user.id = events.uid') 

e現在將包含所有事件相匹配的用戶名,您可以訪問用戶名就像任何其他屬性,例如puts e.user_name。當然,由於它是在SQL查詢中生成的,因此無法更改用戶名。

這種方法可能不符合數據庫無關應用程序的Rails哲學,但是我發現直接使用SQL有時更容易(也可能更快),而不是試圖用ActiveRecord實現同樣的事情。