OR-Operator in WHERE-Klausel mit Arel in Rails 4.2
Der folgende Code hat ein gültiges @ erstelwhere
-Klausel mit einemOR
operator in Rails 4.1
MyModel.where(
MyModel.where(attribute1: 1, attribute2: 2).where_values.reduce(:or)
)
Was entspricht in etwa der SQL
select * from my_models where (attribute1 = 1 OR attribute2 = 2)
In Rails 4.2 generiert derselbe Code eine SQL-Abfrage mit fehlenden Werten für die Bindungsparameter
select * from my_models where attribute1 = OR attribute2 =
... und generiert einen Fehler aufgrund der fehlenden Werte für die gebundenen Werte.
Was ist der entsprechende Code inRails 4.2 um eine gültige Abfrage mit einem OR-Operator zu generieren?
Bearbeiten
Die Lösung erfordert einArel::Nodes::Node
abgeleitetes Objekt, das verwendet werden soll, damit es selbst mit anderen Bedingungen über AND- und OR-Gruppierungen kombiniert werden kann.
rel = MyModel.where(attribute1: 1, attribute2: 2)
conditions = [rel.where_values.reduce(:or).to_sql, *rel.bind_values.map(&:last)]
MyModel.where(conditions)
Dasconditions
var muss eine Ableitung von @ seArel::Nodes::Node
. Die obige Lösung funktioniert für einfache Abfragen, aber für kompliziertere Abfragen,conditions
muss ein Arel-Knoten sein, um an eine endgültige Abfragemethode übergeben zu werden.