Rails 4,相关模型的范围加载所有条目(范围不过滤)

时间:2015-04-19 08:08:51

标签: ruby-on-rails ruby-on-rails-4 scope eager-loading

我有这样的模特:

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尝试了同样的结果。

我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:0)

这应该有用,你需要文章,但条件是在帖子上

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

使用仅可从Post模型访问的范围,有更好的方法。

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

答案 1 :(得分:0)

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

关于文章

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

on Post

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

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

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

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

感谢。