Rails пропускают default_scope при запросе с ассоциацией - PullRequest
0 голосов
/ 06 декабря 2018

Как пропустить default_scope при запросе в консоли rails

Например

class User < ActiveRecord::Base
  default_scope do
   where("type != 'guest'")
  end
end

Запрос будет похож на ассоциацию

Например

p = Product.last
p.users.where("...")

Iнужно пропустить default_scope для пользователя.Я пытался p.users.unscoped, но он выбирал всех пользователей (не только связанных с продуктом)

1 Ответ

0 голосов
/ 06 декабря 2018

Не используйте default_scope.Он укусит вас сзади.

Единственный способ удалить область default_scope - это использовать unscoped, который, как вы уже поняли, удаляет все области - не только default_scope.

Итак p.users.unscoped == User.all.unscoped.

Пока вы можете сделать:

User.unscoped.where(product: p) 

Это не позволяет вам загружать / включать ассоциацию, чтобы избежать N + 1 запросов.

Вместо default_scope следует использовать явные области действия:

class User < ApplicationRecord
  scope :not_guest, ->{ where.not(type: 'guest') }
end

Следует также избегать имени столбца type, если только вы не используете его для наследования одной таблицы (STI).ActiveRecord использует его в некоторых случаях для определения класса записей, и это может привести к неожиданным ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...