0

У меня есть модель пользователя с :except_ids объемом:Rails 3, не может посетить Arel :: SelectManager

scope :except_ids, ->(*ids) { where { id.not_in ids } } 

Проблемы - я не могу использовать его с другими ленивыми запросами. Например, если я называю что-то вроде этого:

User.except_ids(User.except_ids(1,2)) 

Я заканчиваю с

TypeError: Cannot visit Arel::SelectManager 

У меня есть гораздо более сложный запрос в моем проекте, но все работает отлично - за исключением того, что объем. Я могу заставить его работать, заменяя область действительным кодом, но это пахнет.

Итак, есть ли способ узнать это?

ответ

2

Если вы хотите достичь этого с помощью одного SQL-запроса, он должен содержать subquery, который не поддерживается непосредственно Arel, но вы можете использовать, например, this workaround.

Ошибка, которую вы видите, вероятно, вызвана тем фактом, что User.except_ids(1,2) возвращает экземпляр ActiveRecord::Relation, что может быть проблемой для оператора splat в сигнатуре лямбда. Это работает, но приводит к двум запросам:

User.except_ids(User.except_ids(1,2).map(&:id)) 
+0

Ну, дело в том, что карта (&: id) будет загружать результаты для отношения внутри скобок. Пункт всех моих манипуляций - создать один гигантский запрос. – 2013-04-02 09:57:01

+0

Я обновил свой ответ, пожалуйста, посмотрите. – mxgrn

+1

Для большей эффективности с помощью решения с двойным запросом используйте вырезку, а не карту: 'User.except_ids (User.except_ids (1,2) .pluck ('id'))'. Это создает 'SELECT id', а не' SELECT * ', и возвращает его в массив с только идентификаторами. – zykadelic

 Смежные вопросы

  • Нет связанных вопросов^_^