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 查询根本不包括范围部分。
我用 joins
和 includes
试过,结果相同。
我做错了什么?
谢谢。
这应该可行,您需要文章,但条件是 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()
部分在这里非常重要。
谢谢。
我有这样的模型:
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
试过,结果相同。
我做错了什么?
谢谢。
这应该可行,您需要文章,但条件是 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()
部分在这里非常重要。
谢谢。