Допустим, у меня есть модель 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
Какой элегантный способ решить эту проблему?