Rails Error: joins + include

3

我有以下模型:

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(我认为是因为:person在2个模型中被引用)。这是我得到的错误(当我删除:include选项时,它就消失了):“ActiveRecord::StatementInvalid:Mysql :: Error:Not unique table / alias:'people'”。我可以通过编写实际的JOIN命令作为字符串并将其传递到:include选项中来解决此问题,但这不符合Rails-y的方式,因此我希望有更清晰的方法来解决这个问题。非常感谢您的帮助。谢谢!

你能把 SQL 查询粘贴在这里吗?你应该能在日志中看到它。 - Rishav Rastogi
4个回答

2

看起来你称之为“preferences”,而不是“user_preferences”。因此,你的连接应该是:

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

0
使用JOIN时,您已经主动包含了People表,所以不需要再添加“include”。 这应该可以正常工作:
  Image.find(:all, :conditions =>  ["images.person_id = ? AND preferences.image_privacy = ?", user.id, PRIVACY_PUBLIC],
           :joins => [:person => :user_preference])

2
这不正确,因为连接操作不会进行贪婪加载。 - ez.

0
你写了 :conditions => ["images.person_id", user.id],并且说你想要加载拥有这些图片的和图片。但是看起来你只加载属于一个人的图片(而不是一组人的),因为你只指定了一个user.id。
我会这样做:
Person.find(user.id, :include => [:images, :preference], :conditions => ["preferences.image_privacy = ?", PRIVACY_PUBLIC])

它将加载人物及其图像。

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

您可以尝试使用named_scope而不是使用条件语句。


0

可能是表别名的问题,Rails文档在表别名方面有很好的详细说明。

此外,在此处发布SQL也会很有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接