ActiveRecord: как отменить область default_scope при использовании left_join? - PullRequest
0 голосов
/ 15 мая 2019

Допустим, у меня есть модель 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

Какой элегантный способ решить эту проблему?

1 Ответ

0 голосов
/ 15 мая 2019

Используйте метод unscoped, чтобы удалить все предыдущие области.

Person.unscoped.left_join(....

https://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html#method-i-unscoped

РЕДАКТИРОВАТЬ: я неправильно понял, где была область по умолчанию, я думаю, вы можете отменить ассоциацию:

has_many :posts, -> { unscoped }

https://guides.rubyonrails.org/association_basics.html#scopes-for-has-many

По умолчанию эта область должна быть исключена из области видимости.Не уверен на 100%!Надеюсь, это поможет.

...