Rails 4、scope on related model加载所有实体(scope不过滤)

Rails 4, scope on related model loads all enties (scope doesn't filter)

我有这样的模型:

class Post < AvtiveRecord::Base
  belongs_to :article
  default_scope { order(created_at: :desc) }
  scope :active, -> { where(active: true).order(created_at: :desc) }
  scope :where_author, -> (author) { where("author LIKE ?", "#{author}%") }
end

class Article < ActiveRecord::Base
  has_many :posts, dependent: :destroy
end

在 rails 控制台上时,我尝试:

 Article.find(123).posts.where_author("guest")

我得到了期望值。

但是当我在 ArticlesController 中这样做时:

@articles = Article.includes(:posts).posts.where_author("guest") # I will use params array when it work

这会加载所有帖子并忽略范围条件,实际上 SQL 查询根本不包括范围部分。

我用 joinsincludes 试过,结果相同。

我做错了什么?

谢谢。

这应该可行,您需要文章,但条件是 post

Article.joins(:posts).where('posts.author like ?', 'guest%')

有一种更好的方法可以使用只能从 Post 模型访问的范围来执行此操作。

Article.joins(:posts).merge(Post.where_author('guest'))

完整的解决方案(我在项目中使用的代码)是:

文章

scope :post_author, -> (author) { joins(:posts).merge(Post.where_author(author)) }

在 Post

scope :where_author, -> (author) { where("posts.author LIKE ?", "#{author}%") }

现在我可以使用范围并将它们链接如下:

@articles = Article.post_author(params[:post_author])

merge() 部分在这里非常重要。

谢谢。