# Attributi di un modello

**URL:** <https://www.ruby-forum.com/t/attributi-di-un-modello/194835>\
**Category:** IT\
**Created:** [September 11, 2010, 8:42pm UTC](https://www.ruby-forum.com/t/attributi-di-un-modello/194835 "2010-09-11T20:42:41Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![1w4n](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/1/65b543/32.png) [@1w4n](https://www.ruby-forum.com/u/1w4n)\
**Post date:** [September 11, 2010, 8:42pm UTC](https://www.ruby-forum.com/t/attributi-di-un-modello/194835/1 "2010-09-11T20:42:41Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![1w4n](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/1/65b543/32.png) [@1w4n](https://www.ruby-forum.com/u/1w4n)\
**Post date:** [September 11, 2010, 11:12pm UTC](https://www.ruby-forum.com/t/attributi-di-un-modello/194835/2 "2010-09-11T23:12:39Z")

</div>

2010/9/11 Iwan B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 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

---

<div class="post-metadata">

**Author:** ![1w4n](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/1/65b543/32.png) [@1w4n](https://www.ruby-forum.com/u/1w4n)\
**Post date:** [September 12, 2010, 12:09am UTC](https://www.ruby-forum.com/t/attributi-di-un-modello/194835/3 "2010-09-12T00:09:25Z")

</div>

Il 11 settembre 2010 20:42, Iwan B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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]

> **[ActiveRecord::AttributeMethods#read\_attribute - APIdock](https://apidock.com/rails/ActiveRecord/AttributeMethods/read_attribute)**
>
> ActiveRecord::AttributeMethods#read\_attribute - Ruby on Rails API documentation. View source code and usage examples.

[2]

> **[ActiveRecord::AttributeMethods#write\_attribute - APIdock](https://apidock.com/rails/ActiveRecord/AttributeMethods/write_attribute)**
>
> ActiveRecord::AttributeMethods#write\_attribute - Ruby on Rails API documentation. View source code and usage examples.

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
