Могу ли я написать этот запрос более элегантно с AREL / ActiveRecord? - PullRequest
4 голосов
/ 19 октября 2011

Могу ли я написать этот запрос короче и / или более элегантно, используя AREL / ActiveRecord API?

Foo.where("(bar is not null and bar != '') or (baz is not null and baz !='')")

Ответы [ 2 ]

10 голосов
/ 19 октября 2011

Вы можете сделать оператор OR напрямую с Arel, но синтаксис не очень красив и может стать немного сложным для чтения.Вот как это выглядело бы в арле:

foo  = Foo.arel_table
Foo.where(foo[:bar].not_eq(nil).and(foo[:bar].not_eq('')).or(foo[:baz].not_eq(nil).and(foo[:baz].not_eq(''))))

Я бы посоветовал взглянуть на жемчужину визжа.Это дает вам доступ к дополнительным функциям в активной записи.Ваш запрос должен выглядеть следующим образом:

Foo.where{(bar.not_eq nil) & (bar.not_eq '') | (baz.not_eq nil) & (baz.not_eq nil)}

Вот ссылка для получения дополнительной информации: http://erniemiller.org/projects/squeel/

Есть несколько различных способов написать, что в squeel он поддерживает несколькостили синтаксиса, так что, если вам не понравился вышеприведенный, есть альтернативы.

1 голос
/ 19 октября 2011

Разумный способ справиться с этим (если у вас есть права, делайте это, конечно же, в базе данных) - запретить пустые строковые значения в базе данных.Тогда вы можете сделать Foo.where (: bar => nil).Я использую attribute_normalizer для этого, а также для правильного форматирования значений.

https://github.com/mdeering/attribute_normalizer

Быстрый поиск также выявляет пустые пробелы, но я не пробовал этого, потому что нормализатор атрибута уже обеспечивает эту функциональностьдля меня.

https://github.com/rubiety/nilify_blanks

Результирующий sql для поиска, который вы хотите, если у вас есть хорошо сохраненная база данных (пустые или пустые строковые значения для пустых полей, вероятно, так коротки, как это получается. (Я сам предпочитаю пустые строки).

...