我有以下型号:
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所以我希望有更简洁的方法来做到这一点。
非常感谢任何帮助。
谢谢!
答案 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
,而不是使用条件