2012-09-06 14 views
8

Jak dodać dwie relacje jednocześnie? Kiedy spróbuję operatora +, zwraca tablicę. Ale potrzebuję go, aby zwrócić związek.Dodawanie dwóch obiektów ActiveRecord :: Relation

Dzięki, mike

+0

Dlaczego nie możesz tworzyć zasięgów, aby uzyskać wszystko, czego potrzebujesz? Czy jest coś skomplikowanego, czy po prostu nie możesz tego zrobić? Jeśli jest to coś, co możesz zrobić na poziomie bazy danych, nie pozwól mu przejść do poziomu aplikacji. –

Odpowiedz

7

Spróbuj:

new_relation = relation.merge(another_relation) 
+0

co, jeśli jedna z relacji będzie zerowa? – Matt

+0

@Matt nadal działa, nawet jeśli jeden jest zerowy – kittyminky

+0

@kittyminky jeśli jeden jest zerowy, wynik staje się zerowy. – Anwar

2

przypadku dodawania obiektów ActiveRecord :: stosunku, aby uzyskać wynik 'lub' zamiast 'I' (można dostać 'I' zachowanie przez łańcuchowym), a trzeba jeszcze wynik być ActiveRecord :: Relacja grać ładny z innego kodu (meta_search, na przykład) ....

def matching_one_or_two 
    temp = Model.matching_one + Model.matching_two 
    Model.where('id in (?)',temp.map(&:id)) 
end 

pewno nie gre na świecie atest wydajność, ale powoduje, że obiekt ActiveRecord :: Relation wskazuje na wyniki "OR".

Możesz również po prostu wstawić znak "LUB" bezpośrednio do sql, zamiast pytać Railsów, aby je wygenerować, aby aplikacja bazy danych mogła lepiej działać. Jeden przykład:

Model.where ("table_name.col = 'jeden' OR table_name.col = 'dwa'")

To będzie również zwrócić obiekt ActiveRecord :: relacji.

3

Można dodać dwa ActiveRecord :: Relacja z ograniczeniami AREL

constraints_1 = Model.matching_one.arel.constraints 
constraints_2 = Model.matching_two.arel.constraints 

Model.where(constraints_1.and(constraints_2)).class => ActiveRecord::Relation 

Można użyć lub operator zbyt

Model.where(constraints_1.or(constraints_2)).class => ActiveRecord::Relation 

prawdziwy przykład

constraints_1 = User.where(id: 1..5).arel.constraints 
constraints_2 = User.where('id != 2').arel.constraints 

User.where(constraints_1.and(constraints_2)) 

Można oglądać znakomitą obsadę ekranem o tym http://railscasts.com/episodes/355-hacking-with-arel

+0

Czy możesz poprawić nawias? Boli mnie w oczy :-P – schmijos

Powiązane problemy