Attributi di un modello

Ciao,
e’ possibile in Rails ridefinire il tipo (la classe) di un attributo di
un modello (ActiveRecord).

Mi spiego: il mio modello ha l’attributo color_code che è di classe
stringa (colore rgb, 6 caratteri), ma vorrei fare in modo che venga
“castato” a una classe definita da me, esempio Colore, in modo che alle
sue istanze possa applicare il metodo “schiarisci”.

E’ chiaro?

Grazie,
aloha

iwan

2010/9/11 Iwan B. [email protected]:

Ciao,
e’ possibile in Rails ridefinire il tipo (la classe) di un attributo di
un modello (ActiveRecord).

Mi spiego: il mio modello ha l’attributo color_code che è di classe
stringa (colore rgb, 6 caratteri), ma vorrei fare in modo che venga
“castato” a una classe definita da me, esempio Colore, in modo che alle
sue istanze possa applicare il metodo “schiarisci”.

Io sovrascriverei il metodo color_code:

class Something < ActiveRecord::Base
def color_code
Colore.new(read_attribute(:color_code))
end
end

Il 11 settembre 2010 20:42, Iwan B. [email protected] ha
scritto:

Ciao,
e’ possibile in Rails ridefinire il tipo (la classe) di un attributo di
un modello (ActiveRecord).

Ciao,

di questi tempi conviene specificare sempre: Rails 2.3 o Rails 3?

Un modo per fare esattamente quello che chiedi è ridefinire i metodi
read_attribute [1] e write_attribute [2] con qualcosa tipo:

def read_attribute(attr_name)
if attr_name == :color_code
return Color.new(color_code)
else
super
end
end

e qualcosa di analogo per write_attribute.

[1]
http://apidock.com/rails/ActiveRecord/AttributeMethods/read_attribute
[2]
http://apidock.com/rails/ActiveRecord/AttributeMethods/write_attribute

Io tuttavia te lo sconsiglio, mi sembra più sicuro e semplice definire
dei metodi con nomi diversi dall’attributo (ad esempio color), e poi
usare sempre quei metodi nel resto del codice; qualcosa tipo:

class SomeModel < ActiveRecord::Base
def color
color_code && Color.new(color_code)
end

def color=(some_color)
case some_color
when String
self.color_code = some_color
when Color
self.color_code = some_color.code
when nil
self.color_code = nil
else
raise ArgumentError.new(‘some appropriate message’)
end
end
end

pietro