Значение Rails для делегата - PullRequest
       0

Значение Rails для делегата

10 голосов
/ 17 сентября 2011

У меня есть модель User.rb и модель UserSetting.rb, которой я хотел бы делегировать (методы getter и setter).

в user.rb

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

На первый взгляд это прекрасно работает.

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

Но если присмотреться, user.save не распространяется на модель UserSetting.

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

(Таким образом, значение не было сохранено в базе данных).

Это мой вопрос: как я могу получить UserSetting для автоматического сохранения, когда один из его атрибутов изменяется, а затем сохраняется его пользователем?

Это должно происходить только в том случае, если атрибут UserSetting изменяется, в противном случае каждый раз, когда пользователь сохраняется в базе данных, он вызывает дополнительную ненужную и нежелательную запись в базу данных.

Ответы [ 2 ]

10 голосов
/ 05 апреля 2016

В вашей модели User для ассоциации user_setting используйте автосохранение: true

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

  delegate :email_opt_in, :email_opt_in=, :to => :user_setting
end
10 голосов
/ 17 сентября 2011

Я хотел бы исследовать использование обратного вызова ActiveRecord для этого. Я не уверен, что в вашем случае имело бы смысл, но before_update или after_update кажутся логичными. При обратном вызове вам нужно будет вручную запустить вызов сохранения для объекта UserSetting, связанного с пользователем. Вероятно, есть десятки способов сделать это, но что-то вроде этого должно работать:

class User < ActiveRecord::Base
  after_update do |user|
    user.user_setting.save if user.user_setting.changed?
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...