[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