2011-09-16 29 views
9

Tôi có mô hình User.rb và mô hình UserSetting.rb mà tôi muốn ủy quyền (cả hai phương thức getter và setter).Rails Delegate Đặt giá trị

trong user.rb

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

Thoạt nhìn này hoạt động tuyệt vời.

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

Nhưng nhìn kỹ hơn, user.save không truyền sang mô hình UserSetting.

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

(Vì vậy, giá trị không được lưu vào cơ sở dữ liệu).

Đây là câu hỏi của tôi: Làm thế nào tôi có thể nhận UserSetting để lưu tự động khi một trong các thuộc tính của nó được thay đổi và sau đó được lưu bởi người dùng của nó?

Điều này chỉ xảy ra khi thuộc tính UserSetting được thay đổi nếu không người dùng được lưu vào cơ sở dữ liệu, nó sẽ kích hoạt thêm không cần thiết để ghi cơ sở dữ liệu vào một cơ sở dữ liệu không cần thiết &.

+0

Liệu những thay đổi luôn đi qua các hình thức? Bằng cách đó, người ta có thể sử dụng accept_nested_attributes với fields_for. – lulalala

Trả lời

9

Tôi sẽ khám phá bằng cách sử dụng ActiveRecord callback cho việc này. Tôi không chắc chắn điều nào có ý nghĩa nhất trong trường hợp của bạn, nhưng before_update hoặc after_update có vẻ hợp lý. Trong cuộc gọi lại của bạn, bạn sẽ cần kích hoạt một cuộc gọi lưu trên đối tượng UserSetting được liên kết với Người dùng theo cách thủ công. Có lẽ hàng chục cách để thực hiện điều này, nhưng một cái gì đó dọc theo những dòng nên làm việc:

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

Trong mô hình tài khoản của bạn cho user_setting Autosave sử dụng liên kết: true

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

    delegate :email_opt_in, :email_opt_in=, :to => :user_setting 
end 
Các vấn đề liên quan