У меня есть довольно элегантное решение. Вот ваша модель пользователя:
class User < ActiveRecord::Base
has_one :membership, :dependent => :destroy
accepts_nested_attributes_for :membership
def update_membership_with_history attributes
self.membership.attributes = attributes
return true unless self.membership.changed?
self.membership.update_attribute(:active, false)
self.build_membership attributes
self.membership.save
end
end
Этот метод update_membership_with_history позволяет нам обрабатывать измененные или неизмененные записи. Следующая модель членства:
class Membership < ActiveRecord::Base
default_scope :conditions => {:active => true}
belongs_to :user
end
Я немного изменил это, поскольку active должен быть логическим, а не 1 и 0. Обновите вашу миграцию, чтобы соответствовать. Теперь действие обновления, которое является единственной частью вашего леса, которое нужно изменить:
def update
@user = User.find(params[:id], :include => :membership)
membership_attributes = params[:user].delete(:membership_attributes)
if @user.update_attributes(params[:user]) && @user.update_membership_with_history(membership_attributes)
redirect_to users_path
else
render :action => :edit
end
end
Мы просто анализируем атрибуты членства (так что вы можете использовать fields_for в своем представлении) и обновляете их отдельно, и только при необходимости.