2010-04-27 31 views
18

Quando utilizzare il metodo di classe composed_of di ActiveRecord?composto da Rails - quando usarlo?

+2

C'è un bell'esempio nei commenti di quella pagina. – ryeguy

+0

@ryeguy, grazie, leggere quello prima di pubblicare ma non dimostra o discute di dove trarrete vantaggio. (Manca la vista di livello superiore.) – fig

+0

Hai letto questo http://api.rubyonrails.org/classes/ActiveRecord/Aggregations/ClassMethods.html? – Corey

risposta

22

personalmente, penso che questo sia utile quando si hanno oggetti che non sono memorizzati nel database, come mostrato nel database, ad es. temperatura, posizione GPS, equilibrio, ecc.

Si potrebbe quindi chiedere perché quelli non vengono memorizzati nel database? Nel database memorizziamo solo un valore, ma se vogliamo allegare metodi pertinenti e pertinenti a tale valore,

per es.

  1. nel caso di temperatura, potremmo bisogno di metodi come to_fahrenheit, to_celsius, is_boiling_point?, ecc

  2. nel caso della posizione GPS, potremmo bisogno di metodi come distance_from(point), route_to(point), ecc

quindi è abbastanza utile quando possiamo semplicemente creare le classi per questi oggetti e utilizzare composed_of per inizializzare questi oggetti al volo

Speranza che aiuta =)

+0

Così composto_di inizializza l'oggetto che esce dal db. Puoi assegnare lo stesso oggetto ENTRANDO nel db? obj.temperature = my_temp_obj. E se sì, quale metodo chiama sul valore obj per convertirlo nel formato db, essere int, varchar, ecc? – pixelearth

+0

hi @pixelearth, come detto, i valori non sono memorizzati nel database =) – Staelen

3

Un esempio più complesso di come utilizzare 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") } 

Fonte: github wiki.

Problemi correlati