Mam tablicę obiektów, nazwijmy to Indicator
. Chcę uruchomić metody klasy Indicator (te z def self.subjects
różnych, zakresów itp.) Na tej tablicy. Jedynym sposobem, w jaki znam, aby uruchamiać metody klas na grupie obiektów, jest posiadanie ich jako ActiveRecord :: Relation. W końcu uciekam się do dodania to_indicators
metody do Array
.
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
Czasami łączę kilka z tych zakresów w celu odfiltrowania wyników w ramach metod klasowych. Tak więc, mimo że wywołuję metodę na ActiveRecord :: Relation, nie wiem, jak uzyskać dostęp do tego obiektu. Do jego zawartości mogę dotrzeć tylko przez all
. Ale all
jest tablicą. Więc muszę przekonwertować tę tablicę na ActiveRecord :: Relation. Na przykład jest to część jednej z metod:
all.to_indicators.applicable_for_bank(id).each do |indicator|
total += indicator.residual_risk_for(id)
indicator_count += 1 if indicator.completed_by?(id)
end
Myślę, że to sprowadza się do dwóch pytań.
- Jak mogę przekonwertować Array obiektów na ActiveRecord :: Relation? Najlepiej bez robienia za
where
każdym razem. - Podczas uruchamiania
def self.subjects
metody typu na ActiveRecord :: Relation, w jaki sposób mogę uzyskać dostęp do samego obiektu ActiveRecord :: Relation?
Dzięki. Jeśli muszę coś wyjaśnić, daj mi znać.
.all
, po prostu użyj.scoped
tak, jak wskazuje odpowiedź Andrew Marshalla (Chociaż w rails 4 będzie działać.all
). Jeśli okaże się, że musisz zamienić tablicę w relację, gdzieś popełniłeś błąd ...