如何让composed_of关联的Bar对象更新时同步Foo的ActiveRecord属性?
如何让composed_of关联的Bar对象属性变更同步到Foo?
示例对象代码
class Foo < ApplicationRecord composed_of :bar, mapping: [%w[user_id user_id], %w[color color]], converter: proc { |user_id, color| Bar.new(user_id, color) } end class Bar include ActiveModel::Model attr_accessor :user_id, :color def initialize(user_id, color) @user_id = user_id @color = color end def change_to_blue self.color = "blue" end end
问题描述
是否可以实现:当更新bar对象的color时,同步更新Foo的color?
测试代码如下:
foo = Foo.last foo.color = "yellow" foo.bar.change_to_blue puts foo.color
当前执行上述代码会输出yellow,希望能建立Bar到Foo的关联,使输出变为blue,并且执行Foo.save!时,color能保存为blue。
解决方案
要实现需求,核心是让Bar实例属性变更时同步更新关联的Foo对象,可通过以下修改实现:
修改后的Foo类
class Foo < ApplicationRecord composed_of :bar, mapping: [%w[user_id user_id], %w[color color], %w[self foo]], converter: proc { |user_id, color, foo| Bar.new(user_id, color, foo) } end
修改后的Bar类
class Bar include ActiveModel::Model attr_accessor :user_id, :color, :foo def initialize(user_id, color, foo) @user_id = user_id @color = color @foo = foo end # 重写color的setter方法,同步更新关联Foo的color属性 def color=(new_color) @color = new_color @foo.color = new_color if @foo.present? end def change_to_blue self.color = "blue" end end
验证效果
执行原测试代码:
foo = Foo.last foo.color = "yellow" foo.bar.change_to_blue puts foo.color # 输出变为"blue" foo.save! # 数据库中foo的color字段会保存为"blue"
内容的提问来源于stack exchange,提问作者xxcellerator
相关产品推荐
相关产品推荐

