2012-10-16 23 views
1

我的應用程序使用Users,Stories,CompetitionsSubmissions模擬了一個寫作競賽。在Rails中查詢多個關聯的正確方法是什麼?

用戶可以通過提交或作爲所有者參加比賽。我想要一個查詢或方法返回用戶擁有或參與的所有比賽。我有一個方法返回數組,competitions | owned_competitions,但我真的想讓他們ActiveRecord實體,以便我可以鏈接,應用示波器等。

有沒有辦法做到這一點,或更好建立這些關係的方法?

我的模式是這樣的:

user.rb:

has_many :stories 
has_many :submissions 
has_many :competitions, :through => :submissions 
has_many :owned_competitions, :class_name => "Competition" 

story.rb:

belongs_to :user 
has_many :submissions 
has_many :competitions, :through => :submissions 

competition.rb:

belongs_to :owner, :class_name => "User", :foreign_key => 'user_id' 
has_many :submissions 
has_many :competitors, :through => :submissions, :source => :user 
has_many :stories, :through => :submissions 

scope :expiring_today, lambda { where("deadline = ?", Date.today) } 

submission.rb :

belongs_to :user 
belongs_to :story 
belongs_to :competition 
+0

爲什麼downvotes?我搜索了大約40個其他問題,試圖瞭解最佳實踐並沒有解決它... – Heliostatic

回答

1

你想要的是絕對有可能的。實際上,甚至可能甚至沒有編寫任何SQL,但我不知道如何。

這是我想出來的:

Competition.joins('left join submissions on submissions.competition_id = competitions.id').where('competitions.user_id = :uid OR submissions.user_id = :uid', :uid => user) 

我們使用一個左連接(而不是默認的內部連接),使我們仍然可以返回該用戶擁有但沒有提交尚未競賽。

+0

這完美的作品,謝謝。我將它定義爲用戶模型上的類方法。我的模型和關係是否有意義,還是有更好的方法來建立這組關係? – Heliostatic

+0

我沒有發現你的模型和關聯有什麼問題,但最終真正的測試不是「這看起來合乎邏輯嗎?」,而是「這樣做能夠簡單/高效地做我需要的嗎?」。 – MrTheWalrus

相關問題