2009-09-26 59 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