Mam tablicę obiektów, nazwijmy to Indicator. Chcę uruchomić metody klasy Indicator (te z def self.subjectsróż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_indicatorsmetody 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 alljest 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
wherekażdym razem. - Podczas uruchamiania
def self.subjectsmetody 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.scopedtak, 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 ...