我有这样的模特:
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查询根本不包含范围部分。
我已经使用joins
和includes
尝试了同样的结果。
我做错了什么?
感谢。
答案 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()
部分在这里非常重要。
感谢。