2011-09-16 14 views
9

Tengo un modelo User.rb y un modelo UserSetting.rb al que me gustaría delegar (tanto los métodos getter como setter).Valor de conjunto del delegado de rieles

en user.rb

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

A primera vista, esto funciona muy bien.

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

Pero mirando más de cerca el, user.save no se propaga al modelo UserSetting.

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

(De modo que el valor no se guardó en la base de datos).

Esta es mi pregunta: ¿Cómo puedo hacer que UserSetting se guarde automáticamente cuando uno de sus atributos se cambia y luego es guardado por su usuario?

Esto solo debería ocurrir cuando se modifica un atributo de configuración de usuario; de lo contrario, cada vez que se guarda un usuario en la base de datos se generará una escritura no deseada & adicional no necesaria en la base de datos.

+0

¿Tiene cambios siempre van a través de formas? De esa forma uno puede usar accepts_nested_attributes con fields_for. – lulalala

Respuesta

9

Exploraría usando un ActiveRecord callback para esto. No estoy seguro de cuál tendría más sentido en su caso, pero before_update o after_update parecen lógicos. En su devolución de llamada, deberá activar manualmente una llamada de guardado en el objeto UserSetting asociado con el usuario. Hay probablemente de maneras de lograr esto docenas, pero algo en este sentido debería funcionar:

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

En su modelo de usuario para user_setting asociación uso de guardado automático: verdadera

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

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