2012-07-21 39 views
5

quiero definir un método personalizado en una relación activerecord, por ejemplo:Definir método en relación activerecord

Transaction.all.summed_values 

Un ejemplo sencillo sería el caso en summed_values debe evaluar sum(:value) sobre la relación.

¿Dónde debería definir el método summed_values? Parece que debería estar en ActiveRecord::Relation. Si debería estar directamente allí, ¿en qué archivo debería ponerlo?

Además, si este nuevo método sólo tiene significado para Transaction s, ¿hay alguna manera de saber rieles para definir solamente este método para ActiveRecord::Relation s que consisten en Transaction s?

+0

usted puede utilizar directamente 'sum' en una relación, como' Transaction.sum (: valor) 'proporcionada por ActiveRecord :: Cálculos http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html –

Respuesta

7

Cree un método self.summed_values directamente en el modelo de transacción.

+0

Funcionará. También puedes usar un alcance. –

+0

Tanzeeb: mis disculpas. ¡Por favor edita tu pregunta y eliminaré mi voto! – Peter

+1

No entendí que agregar un método de clase a 'Transaction' funcionaría en la relación. ¡Gracias! – Peter

1

¿Hay algún motivo específico por el que desee crear este método como extensión de ActiveRecord :: Relation? Propondría un método de clase así:

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

Esto también tiene la ventaja de que solo está disponible para transacciones.

+0

esto no se lee tan limpiamente o coincide con mi significado y la solución que estoy buscando. el método que quiero llamar específicamente tiene un significado en el objeto de relación, tanto conceptualmente como en la implementación. Estoy de acuerdo en que esto funcionaría, pero no es lo que busco. – Peter

+0

No estoy seguro de por qué le gustaría en el objeto ActiveRecord :: Relation y, sin embargo, que solo se aplique a Transaction. El único enfoque lógico sería subclasificar la relación y hacer que Transaction use su subclase, y no creo que sea más limpia de ninguna manera. –

+0

No entendí previamente cómo funcionó esto, y no me di cuenta de que podría agregar un método de clase a 'Transaction' y funcionaría en la relación. Gracias por ayudarme a entender ... – Peter

1

Debe utilizar extendiéndose

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

Para más información: ActiveRecord::QueryMethods

Cuestiones relacionadas