[ruby-it] update automatico di un campo.

Pietro Giorgianni giorgian a gmail.com
Gio 17 Dic 2009 13:12:47 CET


Il 17 dicembre 2009 13.03, Mauro <mrsanna1 a gmail.com> ha scritto:
> Vorrei che al momento della creazione di un nuovo oggetto venisse
> valorizzato automaticamente uno dei suoi attributi.
> I modelli in questione sono settori e categorie, in relazione uno a molti.
> Il partial della view per la categoria e':
>
>  <%= f.collection_select :sector_id, @sectors, :id, :name, :prompt =>
> "seleziona il settore" %>
>    <%= f.label :descrizione %><br />
>    <%= f.text_field :descr %>
>    <%= f.label :esempi %><br />
>    <%= f.text_area :example %>
>    <%= f.submit label_text %>
>
> in questo modo la categoria e' associata ad un settore.
> La categoria contiene un attributo codice che vorrei venisse
> valorizzato automaticamente col valore dell'attributo codice del
> settore.
> Banalmente nel controller avevo fatto:
>
>
>
> def create
>    @category = Category.new(params[:category])
>    @sectors = Sector.find(:all)
>    @category.code = @sectors[params[:category][:sector_id].to_i]
>
> pero' al codice della categoria viene assegnato un valore che non
> corrisponde a quello del codice del settore selezionato nella select.
> Logicamente mi sembrava corretto ma evidentemente non lo e'.

Il motivo per cui non funziona è che tu speri che gli id siano tutti
consecutivi e senza buchi, ma non è detto che sia così; inoltre, tu
speri che il primo id sia zero, ma qui avrai una grossissima
delusione.

Farsi passare tutti i record per guardarne solo uno è sconsigliato;
anche ridefinire create può avere i suoi svantaggi.

Ti consiglio di usare before_save o before_validation, dipende se fai
validazione e come:
http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

before_save do |c|
  c.code = c.sector && c.sector.code
end

(Nota che, se sector vale null, code viene impostato a null).


pietro


More information about the Ml mailing list