Wie fügen Sie zwei Relationen zusammen? Wenn ich den Operator + versuche, gibt es ein Array zurück. Aber ich brauche es, um eine Beziehung zurückzugeben.Hinzufügen von zwei ActiveRecord :: Relation-Objekten
Dank, mike
Wie fügen Sie zwei Relationen zusammen? Wenn ich den Operator + versuche, gibt es ein Array zurück. Aber ich brauche es, um eine Beziehung zurückzugeben.Hinzufügen von zwei ActiveRecord :: Relation-Objekten
Dank, mike
Versuchen:
new_relation = relation.merge(another_relation)
Was passiert, wenn eine der Beziehungen Null ist? – Matt
@Matt funktioniert immer noch, selbst wenn man null ist – kittyminky
@kittyminky wenn man null ist, wird das Ergebnis Null. – Anwar
Wenn Sie hinzufügen Active :: Relation Objekte ein 'ODER' Ergebnis eher als 'UND' zu bekommen (Sie erhalten würde 'UND' Verhalten von Chaining), und Sie müssen noch das Ergebnis ein Activerecord :: Relation zu nett sein, mit einem anderen Code zu spielen (meta_search, zum Beispiel) ....
def matching_one_or_two
temp = Model.matching_one + Model.matching_two
Model.where('id in (?)',temp.map(&:id))
end
der gre der Welt sicher nicht Attest-Leistung, aber es führt zu einem ActiveRecord :: Relation-Objekt, das auf die OR-Ergebnisse zeigt.
Sie können das "OR" auch direkt in sql einfügen, anstatt Rails zu bitten, es für Sie zu generieren, damit Ihre Datenbankanwendung besser arbeiten kann. Ein Beispiel:
Model.where ("table_name.col = 'one' OR table_name.col = 'zwei'")
, der auch ein Activerecord :: Relation Objekt zurück.
können Sie fügen zwei Active :: Relation mit Arel Constraints
constraints_1 = Model.matching_one.arel.constraints
constraints_2 = Model.matching_two.arel.constraints
Model.where(constraints_1.and(constraints_2)).class => ActiveRecord::Relation
können Sie verwenden oder Betreiber zu
Model.where(constraints_1.or(constraints_2)).class => ActiveRecord::Relation
Reales Beispiel
constraints_1 = User.where(id: 1..5).arel.constraints
constraints_2 = User.where('id != 2').arel.constraints
User.where(constraints_1.and(constraints_2))
Sie hervorragende Screencast sehen können darüber http://railscasts.com/episodes/355-hacking-with-arel
Könnten Sie bitte die Klammern korrigieren? Es schmerzt meine Augen :-P – schmijos
Warum können Sie keine Zielfernrohre erstellen, um alles zu bekommen, was Sie brauchen? Ist etwas komplex oder kann man in diesem Fall einfach nicht tun? Wenn Sie etwas auf Datenbankebene machen können, lassen Sie es nicht auf die Anwendungsebene kommen. –