TLDR:我无法在嵌套中使用where子句(嵌套1或2级)has_many association
#Author.rb
has_many :posts
#Post.rb
belongs_to :author
has_one :post_setting
#PostSetting.rb
#Has attributes like draft (bool), flagged(bool), etc.
belongs_to :post
现在,如果我正在尝试在作者中创建一个关联,找到post_setting.draft = false的所有帖子,例如,如下所示。
has_many :published_posts,
-> {
includes(:post_setting)
.where(post_setting: {draft: false})
.distinct
},
class_name "Post"
遗憾的是,失败并出现以下错误
PG::UndefinedTable: ERROR: missing FROM-clause entry for table "post_setting"
或者,我也希望能够做到以下几点 -
#Group.rb
has_many :authors
has_many :posts,
-> {
includes(:post_setting)
.where(post_setting: {draft: false})
.distinct
},
through: authors
总的来说,我觉得我对于如何/加入/包含协会工作的规则不是很清楚。在帖子上创建范围比在作者has_many
中包含范围更明智吗?
谢谢!
PS。我使用的是Rails 4.2.5。
答案 0 :(得分:2)
要使您的查询有效,您应该使用正确的命名:
has_many :published_posts,
-> {
includes(:post_setting)
.where(post_settings: {draft: false}) # Note the plural table name
.distinct
},
class_name "Post"
这可能令人困惑,但通常条件使用基础表名称,而joins
和includes
使用关联名称。
如果您有理由通过关联限制数据集以匹配某些条件,请使用父模型上定义的关联条件。
如果没有这样的原因并且您希望保持过滤关联数据集的灵活性,请使用在引用模型上定义的范围。