Jak wykonać or
zapytanie w Rails 5 ActiveRecord? Czy można też łączyć w łańcuch or
z where
zapytaniami ActiveRecord?
ruby-on-rails
ruby
activerecord
ruby-on-rails-5
rails-activerecord
KM Rakibul Islam
źródło
źródło
Odpowiedzi:
Możliwość łączenia w łańcuch
or
klauzuli wraz zwhere
klauzulą wActiveRecord
zapytaniu będzie dostępna w Railsach 5 . Zobacz powiązaną dyskusję i żądanie ściągnięcia .W Rails 5 będziesz mógł więc wykonać następujące czynności :
Aby dostać
post
się zid
1 lub 2Kilka innych przykładów:
(A && B) || DO:
(A || B) && C:
źródło
Post.where(a).or(Post.where(b)).where(Post.where(c).or(Post.where(d)))
powinno to stworzyć (a || b) && (c || d)ArgumentError: Unsupported argument type: #<MyModel::ActiveRecord_Relation:0x00007f8edbc075a8> (MyModel::ActiveRecord_Relation)
Nie musimy czekać, aż rails 5 użyje tego
OR
zapytania. Możemy go również używać zrails 4.2.3
. Jest backport tutaj .Dziękuję Ericowi-Guo za klejnot, gdzie-lub , teraz możemy dodać tę
OR
funkcjonalność>= rails 4.2.3
również za pomocą tego klejnotu.źródło
(To tylko dodatek do odpowiedzi KM Rakibul Islam.)
Korzystając z lunet, kod może stać się ładniejszy (w zależności od spojrzenia):
źródło
Musiałem zrobić
(A && B) || (C && D) || (E && F)
Ale w
5.1.4
obecnym stanie Railsów jest to zbyt skomplikowane, aby wykonać to z Arelem lub łańcuchem. Ale nadal chciałem używać Railsów do generowania jak największej liczby zapytań.Więc zrobiłem mały hack:
W swoim modelu stworzyłem prywatną metodę o nazwie
sql_where
:Następnie w moim zakresie utworzyłem tablicę do przechowywania OR
Który przyniesie oczekiwanego rezultatu zapytania:
SELECT * FROM `models` WHERE ((A AND B) OR (C AND D) OR (E AND F))
.A teraz mogę łatwo połączyć to z innymi celownikami itp. Bez niewłaściwych sal operacyjnych.
Piękno polega na tym, że mój sql_where przyjmuje normalne argumenty where-clause:
sql_where(name: 'John', role: 'admin')
wygeneruje(name = 'John' AND role = 'admin')
.źródło
.merge
jako odpowiednika && i zbudować odpowiednie drzewo, aby uchwycić swoje pareny. Coś jak ...(scopeA.merge(scopeB)).or(scopeC.merge(scopeD)).or(scopeE.merge(scopeF))
zakładając, że każdy z teleskopów wyglądaModel.where(...)
Rails 5 ma możliwość
or
klauzuli zwhere
. Na przykład.źródło