2009-09-26 60 views
2

我有以下型號:Rails的錯誤:加入+包括

Image.find(:all, :conditions => ["images.person_id = ? AND preferences.image_privacy = ?", user.id, PRIVACY_PUBLIC], 
       :joins => [:person => :user_preference], :include => :person) 

class Person < ActiveRecord::Base 
has_many :images 
has_one :preference 
end 

class Image < ActiveRecord::Base 
belongs_to :person 
end 

class Preference < ActiveRecord::Base 
belongs_to :person 
end 

我試圖獲取該是公開的所有圖像,並同時渴望負荷誰擁有這些圖片的人

看來Rails不喜歡:include(我相信是因爲:人被引用到2個模型中)。這是我的錯誤(這消失的時候我把:包括選項):

「的ActiveRecord :: StatementInvalid的:mysql ::錯誤:沒有唯一的表/別名:‘人’」

我能得到通過寫出實際的JOIN命令作爲字符串並將其傳遞給:include選項,但這不是Rails-y,所以我希望有一個更簡潔的方法來做到這一點。

任何幫助將不勝感激。

謝謝!

+0

你能在這裏粘貼SQL查詢的,你應該能夠看到日誌 – 2009-09-26 09:26:27

回答

-1

通過使用JOIN,您正在積極地包括People表,因此您不需要再次添加「include」。這應該工作:

Image.find(:all, :conditions => ["images.person_id = ? AND preferences.image_privacy = ?", user.id, PRIVACY_PUBLIC], 
      :joins => [:person => :user_preference]) 
+2

這是在是不正確的,因爲加入不做預先加載。 – 2009-09-26 16:59:34

0

這可能與表混淆的問題,軌道文檔在Table Aliasing

出衆的細節還,SQL後,這裏將是有用的。

1

它看起來像你稱之爲「首選項」,而不是user_preferences。所以,你加入應該是:

:joins => [:person => :preference]) 
-1

您寫道:條件=> [「images.person_id」,user.id]和你說,你要載入圖像和誰擁有這些圖像。但它看起來像加載屬於一個人(而不是一羣人)的圖像,因爲你只指定一個user.id。

我會做這種方式:

Person.find(user.id, :include => [:images, :preference], :conditions => ["preferences.image_privacy = ?", PRIVACY_PUBLIC]) 

它將裝載的人,他/她的形象。

大概我不能正確理解你的問題,因爲我認爲你想要做的事對我來說似乎並不符合邏輯。

而不是使用情況,您可以嘗試named_scope