Я использую Rails3, ActiveRecord
Просто интересно, как я могу связать области видимости с помощью операторов OR вместо AND.
например
Person.where(:name => "John").where(:lastname => "Smith")
Это обычно возвращает:
name = 'John' AND lastname = 'Smith'
но я бы хотел:
`name = 'John' OR lastname = 'Smith'
Ответы:
Вы бы сделали
Прямо сейчас нет никакой другой ИЛИ поддержки с новым синтаксисом AR3 (то есть без использования какого-либо стороннего гема).
источник
.or
встроен .Согласно этому запросу , Rails 5 теперь поддерживает следующий синтаксис для цепочки запросов:
Существует также бэкпорт функциональности в Rails 4.2 через этот драгоценный камень.
источник
Используйте ARel
источник
Просто опубликовать синтаксис Array для того же столбца или запросов, чтобы помочь выглядывает.
источник
Обновление для Rails4
не требует никаких сторонних драгоценных камней
Старый ответ
не требует никаких сторонних драгоценных камней
источник
or
или других операторов внутри текстового блока, ни один из которых не отражен в коде ОП....where_values.join(' OR ')
в моем случае.tap {|sc| sc.bind_values = [a, b].map(&:bind_values) }
деталь, если в ваших областях нет переменных, которые необходимо связать.Вы также можете использовать гем MetaWhere, чтобы не смешивать ваш код с SQL-компонентами:
источник
В случае, если кто-то ищет обновленный ответ на этот вопрос, похоже, что существует существующий пул-запрос для передачи его в Rails: https://github.com/rails/rails/pull/9052 .
Благодаря патчу @j-mcnally для ActiveRecord ( https://gist.github.com/j-mcnally/250eaaceef234dd8971b ) вы можете сделать следующее:
Еще более ценной является возможность связывать области видимости с
OR
:Затем вы можете найти всех людей с именем или фамилией или чей родитель с фамилией
Не лучший пример для использования этого, но просто пытаюсь соответствовать этому вопросу.
источник
.or
функциональности цепочки. Я смог использовать патч обезьяны, который я упоминал в Rails> = 3.2; однако вы можете подождать, пока Rails 5 внесет какие-либо давние изменения в ваш код.Для меня (Rails 4.2.5) это работает только так:
источник
Это было бы хорошим кандидатом для MetaWhere, если вы используете Rails 3.0+, но это не работает на Rails 3.1. Возможно, вы захотите попробовать Squeel вместо этого. Это сделано тем же автором. Вот как бы вы выполнили цепочку на основе ИЛИ:
Вы можете смешивать и сочетать AND / OR, среди многих других удивительных вещей .
источник
Обновленная версия Rails / ActiveRecord может изначально поддерживать этот синтаксис. Это будет выглядеть примерно так:
Как отмечено в этом запросе на получение доступа, https://github.com/rails/rails/pull/9052.
На данный момент просто придерживаться следующих работ прекрасно работает:
источник
Foo.where(foo: 'bar1').or.where(bar: 'bar2')
не работает. Это должно быть Foo.where (foo: 'bar1'). Or.where (Foo.where (bar: 'bar2'))Рельсы 4 + Сфера + Арель
Я попытался связать именованные области с .or, но безуспешно, но это сработало, чтобы найти что-нибудь с этим логическим набором. Создает SQL как
источник
Рельсы 4
источник
Если вы хотите предоставить область (вместо явной работы над всем набором данных), вот что вы должны сделать с Rails 5:
Или:
источник
Если вы не можете выписать предложение where вручную, чтобы включить оператор "или" (т. Е. Хотите объединить две области), вы можете использовать union:
(источник: ActiveRecord Query Union )
Это вернет все записи, соответствующие любому запросу. Тем не менее, это возвращает массив, а не arel. Если вы действительно хотите вернуть верблюда, вы можете обратиться к этой сути: https://gist.github.com/j-mcnally/250eaaceef234dd8971b .
Это сработает, если вы не возражаете, если обезьяна исправит рельсы.
источник
Также посмотрите эти связанные вопросы: здесь , здесь и здесь
Для рельсов 4, на основе этой статьи и этого оригинального ответа
Обратите внимание на предостережение статьи в конце:
источник
Это очень удобный способ, и он отлично работает в Rails 5:
источник
squeel
камень обеспечивает невероятно простой способ сделать это (до этого я использовал что - то вроде метода @ coloradoblue в):источник
Таким образом, ответ на первоначальный вопрос, можете ли вы присоединиться к областям действия с «или» вместо «и», кажется «нет, вы не можете». Но вы можете написать код совершенно другой области или запроса, который выполняет эту работу, или использовать другую среду из ActiveRecord, например, MetaWhere или Squeel. Не полезно в моем случае
Я 'или' область видимости, сгенерированная pg_search, которая делает немного больше, чем select, она включает в себя порядок ASC, что создает беспорядок чистого объединения. Я хочу «или» это с ручной областью, которая делает вещи, которые я не могу сделать в pg_search. Так что я должен был сделать это так.
Т.е. превратить области в sql, заключить их в квадратные скобки, объединить их вместе и затем find_by_sql, используя сгенерированный sql. Это немного мусора, но это работает.
Нет, не говорите мне, что я могу использовать "против: [: name,: code]" в pg_search, я хотел бы сделать это так, но поле 'name' - это hstore, которое pg_search не может обработать все же. Таким образом, область действия по имени должна быть создана вручную, а затем объединена с областью действия pg_search.
источник
источник