Usando o estilo Rails 3, como eu escreveria o oposto de:
Foo.includes(:bar).where(:bars=>{:id=>nil})
Quero descobrir onde o ID NÃO é nulo. Eu tentei:
Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql
Mas isso retorna:
=> "SELECT \"foos\".* FROM \"foos\" WHERE (\"bars\".\"id\" = 1)"
Definitivamente, não é disso que eu preciso, e quase parece um bug no ARel.
ruby-on-rails
rails-activerecord
arel
SooDesuNe
fonte
fonte
!nil
Avalia comotrue
em Ruby, e Arel traduztrue
a1
em uma consulta SQL. Portanto, a consulta gerada é de fato o que você solicitou - não foi um bug do ARel.Respostas:
A maneira canônica de fazer isso com o Rails 3:
O ActiveRecord 4.0 e superior adiciona
where.not
para que você possa fazer isso:Ao trabalhar com escopos entre tabelas, prefiro aproveitar
merge
para poder usar os escopos existentes com mais facilidade.Além disso, como
includes
nem sempre escolhe uma estratégia de associação, você deve usarreferences
aqui também, caso contrário, poderá acabar com SQL inválido.fonte
rails undefined method 'not_eq' for :confirmed_at:Symbol
..where
condições do @BKSpurgeon Chaining são simplesmente a construção de um AST, ele não atinge o banco de dados até que você atinja um método terminal comoeach
outo_a
. Construir a consulta não é uma preocupação de desempenho; o que você está solicitando do banco de dados é.Não é um bug no ARel, é um bug na sua lógica.
O que você quer aqui é:
fonte
true
, que é um booleano.:id => true
leva vocêid = 1
ao SQLese.field_name != 'NULL'
.id = 't'
:)Para Rails4:
Então, o que você quer é uma junção interna, então você realmente deve usar o predicado de junções:
Mas, para o registro, se você deseja uma condição "NOT NULL", basta usar o não predicado:
Observe que essa sintaxe relata uma descontinuação (ela fala sobre um trecho de código SQL, mas acho que a condição de hash foi alterada para string no analisador?), Portanto, adicione as referências ao final:
fonte
references
ligação me ajudou!Não tenho certeza disso é útil, mas é isso que funcionou para mim no Rails 4
fonte
Com o Rails 4, é fácil:
Veja também: http://guides.rubyonrails.org/active_record_querying.html#not-conditions
fonte