2012-09-06 14 views
8

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

+0

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. –

Antwort

7

Versuchen:

new_relation = relation.merge(another_relation) 
+0

Was passiert, wenn eine der Beziehungen Null ist? – Matt

+0

@Matt funktioniert immer noch, selbst wenn man null ist – kittyminky

+0

@kittyminky wenn man null ist, wird das Ergebnis Null. – Anwar

2

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.

3

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

+0

Könnten Sie bitte die Klammern korrigieren? Es schmerzt meine Augen :-P – schmijos

Verwandte Themen