2010-04-27 7 views
18

¿Cuándo se debe utilizar el método de la clase ActiveRecord composed_of?compuesto_de en Rieles: ¿cuándo usarlo?

+2

Hay un buen ejemplo en los comentarios de esta página. – ryeguy

+0

@ryeguy, gracias, léelo antes de publicarlo, pero no demuestra ni analiza dónde te beneficiarías de él. (Falta la vista de nivel superior.) – fig

+0

Ha leído éste http://api.rubyonrails.org/classes/ActiveRecord/Aggregations/ClassMethods.html? – Corey

Respuesta

22

personalmente, creo que esto es útil cuando se tiene objetos que no se almacenan en la base de datos, como se muestra en la base de datos, por ejemplo, la temperatura, la ubicación GPS, equilibrio, etc.

Usted puede preguntar entonces ¿por qué los que no se almacenan en la base de datos? En la base de datos que sólo almacenar un valor, pero si queremos adjuntar métodos útiles, pertinentes a ese valor,

por ejemplo,

  1. en el caso de la temperatura, que podríamos necesitar métodos como to_fahrenheit, to_celsius, is_boiling_point?, etc

  2. en el caso de localización GPS, que podríamos necesitar métodos como distance_from(point), route_to(point), etc

por lo que es bastante útil cuando podemos simplemente crear las clases para estos objetos, y usar composed_of para inicializar estos objetos sobre la marcha

espero que ayude =)

+0

So compuesto_de inicializa el obj que sale del db. ¿Puedes asignar el mismo objeto PARA IR AL Db? obj.temperature = my_temp_obj. Y si es así, ¿a qué método llama el valor obj para convertirlo al formato db, sea ese int, varchar, etc.? – pixelearth

+0

hi @pixelearth, como se mencionó, los valores no se almacenan en la base de datos =) – Staelen

3

Un ejemplo más complejo de cómo utilizar composed_of con Money:

composed_of :price, 
    :class_name => "Money", 
    :mapping => [%w(cents cents), %w(currency currency_as_string)], 
    :constructor => Proc.new { |cents, currency| Money.new(cents || 0, currency || Money.default_currency) }, 
    :converter => Proc.new { |value| value.respond_to?(:to_money) ? value.to_money : raise(ArgumentError, "Can't convert #{value.class} to Money") } 

Fuente: github wiki.

Cuestiones relacionadas