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
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
Spróbuj:
new_relation = relation.merge(another_relation)
co, jeśli jedna z relacji będzie zerowa? – Matt
@Matt nadal działa, nawet jeśli jeden jest zerowy – kittyminky
@kittyminky jeśli jeden jest zerowy, wynik staje się zerowy. – Anwar
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.
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
Czy możesz poprawić nawias? Boli mnie w oczy :-P – schmijos
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. –