Rails错误:加入+包含

时间:2009-09-26 08:47:33

标签: ruby-on-rails eager-loading

我有以下型号:

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

我正在尝试获取所有公开的图片,同时急切地加载拥有这些图片的人:

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

看起来Rails不喜欢:include(我相信因为:在2个模型中引用了人)。这是我得到的错误(当我删除:include选项时消失了):

“ActiveRecord :: StatementInvalid:Mysql :: Error:not unique table / alias:'people'”

我可以通过将实际的JOIN命令写成字符串并将其传递到:include选项来解决这个问题,但这不是Rails-y所以我希望有更简洁的方法来做到这一点。

非常感谢任何帮助。

谢谢!

4 个答案:

答案 0 :(得分:1)

看起来你称之为“偏好”,而不是user_preferences。所以你加入应该是:

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

答案 1 :(得分:0)

这可能是表别名的问题,rails doc在Table Aliasing

中有很多详细信息

此外,在这里发布SQL也很有用。

答案 2 :(得分:-1)

通过使用JOIN,您可以主动包含People表,因此您无需再次添加“include”。这应该有效:

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

答案 3 :(得分:-1)

您写道:conditions =&gt; [“images.person_id”,user.id]并且您说要加载拥有这些图片的图片和。但看起来你正在加载属于一个人(而不是一群人)的图像,因为你只指定了一个user.id。

我会这样做:

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

它会加载人和他/她的图像。

可能我不能正确理解你的问题,因为我认为你想做的事情对我来说似乎不合逻辑。

您可以尝试named_scope

,而不是使用条件