Wie würde ich mit dem Rails 3-Stil das Gegenteil von schreiben:
Foo.includes(:bar).where(:bars=>{:id=>nil})
Ich möchte herausfinden, wo id NICHT Null ist. Ich habe es versucht:
Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql
Aber das kehrt zurück:
=> "SELECT \"foos\".* FROM \"foos\" WHERE (\"bars\".\"id\" = 1)"
Das ist definitiv nicht das, was ich brauche, und scheint fast wie ein Fehler in ARel.
ruby-on-rails
rails-activerecord
arel
SooDesuNe
quelle
quelle
!nil
auswertet , umtrue
in Ruby und Arel übersetzt ,true
um1
in einer SQL - Abfrage. Die generierte Abfrage ist also genau das, wonach Sie gefragt haben - dies war kein ARel-Fehler.Antworten:
Der kanonische Weg, dies mit Rails 3 zu tun:
ActiveRecord 4.0 und höher fügt hinzu,
where.not
damit Sie dies tun können:Wenn ich mit Bereichen zwischen Tabellen arbeite, bevorzuge ich die Hebelwirkung,
merge
damit ich vorhandene Bereiche einfacher verwenden kann.Da
includes
nicht immer eine Join-Strategie ausgewählt wird, sollten Sie diese auchreferences
hier verwenden, da Sie sonst möglicherweise ungültiges SQL erhalten.quelle
rails undefined method 'not_eq' for :confirmed_at:Symbol
..where
einfach einen AST. Er trifft die Datenbank erst, wenn Sie eine Terminalmethode wieeach
oder treffento_a
. Das Erstellen der Abfrage ist kein Leistungsproblem. Was Sie von der Datenbank anfordern, ist.Es ist kein Fehler in ARel, es ist ein Fehler in Ihrer Logik.
Was Sie hier wollen, ist:
quelle
true
, was ein Boolescher Wert ist.:id => true
bringt Sieid = 1
in SQLese.field_name != 'NULL'
.id = 't'
:)Für Rails4:
Was Sie also wollen, ist eine innere Verknüpfung. Sie sollten also wirklich nur das Prädikat "Verknüpfungen" verwenden:
Wenn Sie jedoch eine "NOT NULL" -Bedingung wünschen, verwenden Sie einfach das Prädikat not:
Beachten Sie, dass diese Syntax eine Abwertung meldet (es handelt sich um ein String-SQL-Snippet, aber ich denke, die Hash-Bedingung wird im Parser in String geändert?). Fügen Sie daher die Verweise am Ende hinzu:
quelle
references
Anruf hat mir geholfen!Ich bin mir nicht sicher, ob dies hilfreich ist, aber das hat bei mir in Rails 4 funktioniert
quelle
Mit Rails 4 ist es einfach:
Siehe auch: http://guides.rubyonrails.org/active_record_querying.html#not-conditions
quelle