Używając stylu szyn 3, jak napisałbym przeciwieństwo:
Foo.includes(:bar).where(:bars=>{:id=>nil})
Chcę dowiedzieć się, gdzie identyfikator NIE jest zerowy. Próbowałem:
Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql
Ale to zwraca:
=> "SELECT \"foos\".* FROM \"foos\" WHERE (\"bars\".\"id\" = 1)"
To zdecydowanie nie jest to, czego potrzebuję i prawie wydaje się błędem w ARel.
ruby-on-rails
rails-activerecord
arel
SooDesuNe
źródło
źródło
!nil
Zwracatrue
w Ruby i AREL przekładatrue
się1
w zapytaniu SQL. Tak więc wygenerowane zapytanie jest tym, o co prosiłeś - nie był to błąd ARel.Odpowiedzi:
Kanoniczny sposób, aby to zrobić za pomocą Rails 3:
ActiveRecord 4.0 i wyżej dodaje
where.not
, abyś mógł to zrobić:Podczas pracy z zakresami między tabelami wolę korzystać z dźwigni,
merge
aby łatwiej korzystać z istniejących zakresów.Ponadto, ponieważ
includes
nie zawsze wybiera strategię łączenia, należy również użyćreferences
tutaj, w przeciwnym razie może dojść do nieprawidłowego SQL.źródło
rails undefined method 'not_eq' for :confirmed_at:Symbol
..where
Warunki łączenia są po prostu budowaniem AST, nie trafiają do bazy danych, dopóki nie trafisz na terminalową metodę, taką jakeach
lubto_a
. Tworzenie zapytania nie ma wpływu na wydajność; o to prosisz z bazy danych.To nie jest błąd w ARel, to błąd w twojej logice.
Tutaj chcesz:
źródło
true
, co jest wartością logiczną.:id => true
dostanie cięid = 1
w SQLese.field_name != 'NULL'
.id = 't'
:)Dla Rails4:
Więc to, czego chcesz, to połączenie wewnętrzne, więc naprawdę powinieneś po prostu użyć predykatu złączeń:
Ale, dla przypomnienia, jeśli chcesz warunek „NOT NULL”, po prostu użyj predykatu:
Zauważ, że ta składnia zgłasza wycofanie (mówi o fragmencie kodu SQL, ale myślę, że warunek skrótu został zmieniony na string w parserze?), Więc pamiętaj, aby dodać odwołania na końcu:
źródło
references
Rozmowa pomogła mi!Nie jestem pewien, czy to jest pomocne, ale to, co działało dla mnie w Rails 4
źródło
Z Rails 4 jest to łatwe:
Zobacz także: http://guides.rubyonrails.org/active_record_querying.html#not-conditions
źródło