Используя стиль rails 3, я бы написал противоположность:
Foo.includes(:bar).where(:bars=>{:id=>nil})
Я хочу найти, где идентификатор не ноль. Я старался:
Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql
Но это возвращает:
=> "SELECT \"foos\".* FROM \"foos\" WHERE (\"bars\".\"id\" = 1)"
Это определенно не то, что мне нужно, и почти похоже на ошибку в ARel.
ruby-on-rails
rails-activerecord
arel
SooDesuNe
источник
источник
!nil
принимает значениеtrue
в Ruby, и AREL переводитtrue
к1
в запросе SQL. Таким образом, сгенерированный запрос фактически является тем, о чем вы просили - это не ошибка ARel.Ответы:
Канонический способ сделать это с Rails 3:
ActiveRecord 4.0 и выше добавляет,
where.not
чтобы вы могли сделать это:При работе с областями между таблицами я предпочитаю использовать,
merge
чтобы мне было проще использовать существующие области.Кроме того, поскольку
includes
не всегда выбирается стратегия объединения, вам следует использовать иreferences
здесь, иначе вы можете получить недопустимый SQL.источник
rails undefined method 'not_eq' for :confirmed_at:Symbol
..where
Условия цепочки - это просто создание AST, оно не попадает в базу данных, пока вы не нажмете на терминальный метод, такой какeach
илиto_a
. Построение запроса не является проблемой производительности; то, что вы запрашиваете из базы данных.Это не ошибка в ARel, это ошибка в вашей логике.
Что вы хотите здесь:
источник
true
, что является логическим значением.:id => true
получает васid = 1
в SQLese.field_name != 'NULL'
.id = 't'
:)Для Rails4:
Итак, вам нужно внутреннее соединение, так что вам просто нужно использовать предикат соединений:
Но, для записи, если вы хотите условие «НЕ НУЛЬ», просто используйте предикат not:
Обратите внимание, что этот синтаксис сообщает об устаревании (он говорит о фрагменте SQL строки, но я предполагаю, что условие хеш-функции изменено на строку в синтаксическом анализаторе?), Поэтому обязательно добавьте ссылки в конец:
источник
references
Вызов помог мне!Не уверен, что это полезно, но это то, что сработало для меня в Rails 4
источник
С Rails 4 это легко:
Смотрите также: http://guides.rubyonrails.org/active_record_querying.html#not-conditions
источник