Come si esegue una or
query in Rails 5 ActiveRecord? Inoltre, è possibile concatenare or
con where
query in ActiveRecord?
Come si esegue una or
query in Rails 5 ActiveRecord? Inoltre, è possibile concatenare or
con where
query in ActiveRecord?
Risposte:
La possibilità di concatenare or
clausole insieme a where
clausole in ActiveRecord
query sarà disponibile in Rails 5 . Vedere la discussione correlata e la richiesta pull .
Quindi, sarai in grado di fare le seguenti cose in Rails 5 :
Per ottenere un post
con id
1 o 2:
Post.where('id = 1').or(Post.where('id = 2'))
Alcuni altri esempi:
(A && B) || C:
Post.where(a).where(b).or(Post.where(c))
(A || B) && C:
Post.where(a).or(Post.where(b)).where(c)
Post.where(a).or(Post.where(b)).where(Post.where(c).or(Post.where(d)))
questo dovrebbe creare (a || b) && (c || d)
ArgumentError: Unsupported argument type: #<MyModel::ActiveRecord_Relation:0x00007f8edbc075a8> (MyModel::ActiveRecord_Relation)
Avevo bisogno di fare un file (A && B) || (C && D) || (E && F)
Ma allo 5.1.4
stato attuale di Rails questo diventa troppo complicato da realizzare con Arel or-chain. Ma volevo comunque utilizzare Rails per generare il maggior numero possibile di query.
Quindi ho fatto un piccolo trucco:
Nel mio modello ho creato un metodo privato chiamato sql_where
:
private
def self.sql_where(*args)
sql = self.unscoped.where(*args).to_sql
match = sql.match(/WHERE\s(.*)$/)
"(#{match[1]})"
end
Successivamente nel mio ambito ho creato un array per contenere gli OR
scope :whatever, -> {
ors = []
ors << sql_where(A, B)
ors << sql_where(C, D)
ors << sql_where(E, F)
# Now just combine the stumps:
where(ors.join(' OR '))
}
Che produrrà il risultato della query previsto:
SELECT * FROM `models` WHERE ((A AND B) OR (C AND D) OR (E AND F))
.
E ora posso combinarlo facilmente con altri ambiti ecc. Senza alcun OR errato.
Il bello è che il mio sql_where accetta normali argomenti della clausola where:
sql_where(name: 'John', role: 'admin')
genererà (name = 'John' AND role = 'admin')
.
.merge
come l'equivalente di && e costruire un albero appropriato per catturare i tuoi genitori. Qualcosa di simile ... (scopeA.merge(scopeB)).or(scopeC.merge(scopeD)).or(scopeE.merge(scopeF))
, supponendo che ciascuno degli ambiti assomigli a qualcosa di simileModel.where(...)
Rails 5 ha capacità di or
clausola con where
. Per esempio.
User.where(name: "abc").or(User.where(name: "abcd"))