【发布时间】:2019-10-02 00:41:23
【问题描述】:
假设我有一个模型Person。这个Person 有很多Posts。帖子具有排除所有软删除条目的默认范围。软删除意味着属性deleted_at 不是nil。
class Person < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :person
default_scope { where(:deleted_at => nil) }
end
我现在想查询至少有一个帖子的所有人,并且我还想包括软删除的帖子 - 所以我希望默认范围不适用。使用
Person.left_joins(:posts).where.not(posts: { id: nil })
在此 SQL 中仍然应用默认范围和结果:
SELECT `persons`.* FROM `persons` LEFT OUTER JOIN `posts` ON `posts`.`person_id` = `persons`.`id` AND `posts`.`deleted_at` IS NULL WHERE `posts`.`id` IS NOT NULL
解决这个问题的优雅方法是什么?
【问题讨论】:
标签: ruby-on-rails join activerecord ruby-on-rails-5 left-join