2011-09-16 15 views
9

Ho un modello User.rb e un modello UserSetting.rb che vorrei delegare a (entrambi i metodi getter e setter).Rails Delegate Set Value

in user.rb

delegate :email_opt_in, :email_opt_in=, :to => :user_setting 

A prima vista questa grande opera.

user = User.find(1) 
user.email_opt_in #=> false 
user.email_opt_in = true 
user.save 
user.email_opt_in #=> true 

Ma guardando più da vicino il, user.save non propaga al modello UserSetting.

User.find(1).email_opt_in #=> false 

(Quindi il valore non è stato salvato nel database).

Questa è la mia domanda: come posso ottenere che UserSetting salvi automaticamente quando uno dei suoi attributi viene modificato e quindi salvato dall'utente?

Questo dovrebbe accadere solo quando un attributo UserSetting viene modificato, altrimenti ogni volta che un utente viene salvato nel database, si attiverà un'ulteriore scrittura non necessaria & indesiderata nel database.

+0

Vuol modifiche passare sempre attraverso le forme? In questo modo si possono usare accept_nested_attributes con fields_for. – lulalala

risposta

9

Vorrei esplorare utilizzando uno ActiveRecord callback per questo. Non sono sicuro di ciò che potrebbe avere più senso nel tuo caso, ma before_update o after_update sembrano logici. Nella richiamata, è necessario attivare manualmente una chiamata di salvataggio sull'oggetto UserSetting associato all'utente. C'è probabilmente decine di modi per ottenere questo risultato, ma qualcosa in questo senso dovrebbe funzionare:

class User < ActiveRecord::Base 
    after_update do |user| 
    user.user_setting.save if user.user_setting.changed? 
    end 
end 
6

nel modello utente per user_setting associazione utilizzo di salvataggio automatico: vero

class User < ActiveRecord::Base 
    has_one :user_setting, autosave: true 

    delegate :email_opt_in, :email_opt_in=, :to => :user_setting 
end