Удалить предложение 'where' из ActiveRecord :: Relation - PullRequest
15 голосов
/ 13 июня 2011

У меня есть метод класса для пользователя, который возвращает сложный выбор / соединение / порядок / лимит для пользователя и возвращает отношение.Также применяется условие where(:admin => true).Можно ли удалить этот конкретный оператор where, если у меня есть этот объект отношения со мной?

Что-то вроде

User.complex_stuff.without_where(:admin => true)

Ответы [ 4 ]

27 голосов
/ 25 августа 2014

Я знаю, что это старый вопрос, но начиная с рельсов 4, теперь вы можете сделать это

User.complex_stuff.unscope(where: :admin)

Это удалит часть запроса where admin, если вы хотите отсканировать всю where часть unconditinoally

User.complex_stuff.unscope(:where)

ps: спасибо @Samuel за указание на мою ошибку

10 голосов
/ 13 июня 2011

Я не нашел способ сделать это.Лучшее решение, вероятно, - реструктурировать существующий метод complex_stuff.

Сначала создайте новый метод complex_stuff_without_admin, который выполняет все, что делает complex_stuff, за исключением добавления where(:admin => true).Затем перепишите метод complex_stuff, чтобы вызвать User.complex_stuff_without_admin.where(:admin => true).

. Просто подойдите к нему с противоположной стороны.Добавляйте, где нужно, а не забирайте, где не нужно.

6 голосов
/ 13 июня 2011

Вы можете сделать что-то вроде этого (where_values содержит каждый where запрос; вам нужно настроить SQL, чтобы соответствовать точному выводу :admin => true в вашей системе).Имейте в виду, что это будет работать только в том случае, если вы еще не выполнили запрос (т.е. вы не вызвали .all для него или не использовали его результаты в представлении):

@users = User.complex_stuff
@users.where_values.delete_if { |query| query.to_sql == "\"users\".\"admin\" = 't'" }

Однако,Я настоятельно рекомендую использовать ответ Эмили о реструктуризации метода complex_stuff.

0 голосов
/ 24 апреля 2015

Мне нужно было сделать это (Remove a 'where' clause from an ActiveRecord::Relation, который создавался областью видимости) при объединении двух областей, и сделал это так: self.scope(from,to).values[:joins].

Я хотел объединить значения из двух областей, которые составляли «join_scope», без предложений «where», чтобы я мог отдельно добавлять измененные «where» (измененные для использования «OR» вместо «AND») .

Для меня это пошло в объединенных объёмах, вот так:

scope :joined_scope, -> (from, to) {
  joins(self.first_scope(from,to).values[:joins])
  .joins(self.other_scope(from,to).values[:joins])
  .where(first_scope(from,to).ast.cores.last.wheres.inject{|ws, w| (ws &&= ws.and(w)) || w}
  .or(other_scope(from,to).ast.cores.last.wheres.last))
}

Надеюсь, что кому-то поможет

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