Rails:嵌套has_many关联中的子句

时间:2016-07-12 17:45:25

标签: ruby-on-rails activerecord

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。

1 个答案:

答案 0 :(得分:2)

要使您的查询有效,您应该使用正确的命名:

has_many :published_posts,
  -> {
       includes(:post_setting)
       .where(post_settings: {draft: false}) # Note the plural table name
       .distinct
     },
  class_name "Post"

这可能令人困惑,但通常条件使用基础表名称,而joinsincludes使用关联名称。

如果您有理由通过关联限制数据集以匹配某些条件,请使用父模型上定义的关联条件。

如果没有这样的原因并且您希望保持过滤关联数据集的灵活性,请使用在引用模型上定义的范围。