В Activerecord для поля foo
, которое может быть ноль, ложь, истина, .where.not(foo: true)
не возвращает все записи, для которых foo не соответствует действительности ... он пропускает все записи, где foo равно nil.
В ретроспективе я полагаю, что это не удивительно, поскольку Activerecord требует от вас использовать [nil, false]
при запросе напрямую, но это противоречит интуиции в том смысле, что все другие использования .where.not () возвращают «обратное» для .where ()
ВОПРОС: Существует ли вариант .where.not (Z), который работает независимо от того, включает ли Z логические значения или нет?Или есть параметр, который сообщает ActiveRecord, что «не верно» должно быть [nil, false], а не просто «false»?
> Ticket.count
=> 6953
> Ticket.where(outbound: true).count
=> 2
> Ticket.where.not(outbound: true).count
=> 0 # does NOT count the 6951 records where boolean is "not true"
> Ticket.where.not(outbound: true).to_sql
=> "SELECT \"tickets\".* FROM \"tickets\" WHERE \"tickets\".\"outbound\" != TRUE"