2012-07-21 17 views
5

Chcę zdefiniować niestandardową metodę na relacji ActiveRecord, np:Zdefiniować metodę na ActiveRecord stosunku

Transaction.all.summed_values 

Prostym przykładem byłoby gdzie summed_values powinien ocenić sum(:value) na relacji.

Gdzie powinienem zdefiniować metodę summed_values? Wygląda na to, że powinno być na ActiveRecord::Relation. Jeśli powinien być tam bezpośrednio, który plik powinienem umieścić?

Ponadto, jeśli ta nowa metoda ma znaczenie tylko dla Transaction s, czy istnieje sposób, aby powiedzieć szynom, aby zdefiniować tylko tę metodę dla ActiveRecord::Relation s, która składa się z Transaction s?

+0

można użyć bezpośrednio 'sum' o związek, jak' Transaction.sum (wartości): 'dostarczone przez ActiveRecord :: Kalkulacje http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html –

Odpowiedz

7

Utwórz metodę self.summed_values bezpośrednio w modelu transakcji.

+0

To zadziała. Możesz także użyć zakresu. –

+0

Tanzeeb: moje przeprosiny. Zmodyfikuj swoje pytanie, a ja usunę moje poparcie! – Peter

+1

Nie rozumiem, że dodanie metody klasy do 'Transakcji' zadziałałoby na relacji. Dzięki! – Peter

1

Czy istnieje konkretny powód, dla którego chcesz utworzyć tę metodę jako rozszerzenie ActiveRecord :: Relation? Chciałbym zaproponować taką metodę klasy, jak:

class Transaction ... 
    def self.summed_values(transactions=nil) 
    if transactions.nil? 
     all.sum(...)... 
    else 
     where(id => transactions).sum(...)... 
    end 
    end 
end 

Ma to tę zaletę, że jest dostępna tylko dla transakcji.

+0

to nie czyta się tak czysto lub pasuje do mojego znaczenia, a także rozwiązania, którego szukam. metoda, którą chcę wywołać, ma konkretny sens na obiekcie relacji, zarówno koncepcyjnie, jak i we wdrażaniu. Zgadzam się, że to zadziała, ale nie o to mi chodzi. – Peter

+0

Nie jestem pewien, dlaczego chciałbyś go na obiekcie ActiveRecord :: Relation, a mimo to dotyczyć tylko transakcji. Jedynym logicznym podejściem będzie podklasa Relation i zamiast tego Transaction użyje twojej podklasy i nie sądzę, że jest ona czystsza w żaden sposób. –

+0

Nie rozumiałem wcześniej, jak to działało i nie zdawałem sobie sprawy, że można dodać metodę klasy do 'Transakcji' i to działałoby na relacji. Dzięki za pomoc w zrozumieniu ... – Peter

1

należy użyć powiększenia

Transaction.all.extending do 
    def summed_values 
    sum(:what_you_want) 
    end 
end 

Aby uzyskać więcej informacji: ActiveRecord::QueryMethods

Powiązane problemy