对象示例:
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
是否有一种方法,使它,如果我更新酒吧对象的颜色,它也更新Foo的颜色?
例子foo = Foo.last
foo.color = "yellow"
foo.bar.change_to_blue
puts foo.color
目前,以上将导致"yellow"但想知道是否有可能创建链接回到Foo,使结果是"蓝色"?我想要能够做到"foosave"!颜色将更新为"blue">
文档很好地解释了这个概念。
Active Record通过一个名为
composed_of
的类宏方法实现聚合,将属性表示为值对象。
值对象是表示给定值的不可变且可互换的对象…将值对象视为不可变的也很重要。不要允许[Bar]对象在创建后改变它的[颜色]。用新的值创建一个新的[Bar]对象。
另外,我认为您的converter
是不正确的,因为转换器用于赋值,因此只传递单个值。
所以我认为下面的内容实际上是你想要改变的颜色。
class Foo < ApplicationRecord
composed_of :bar,
mapping: [%w[user_id user_id], %w[color color]],
constructor: proc { |user_id, color| Bar.new(user_id, color) }
end
class Bar
include ActiveModel::Model
attr_reader :user_id, :color
def initialize(user_id, color)
@user_id = user_id
@color = color
end
def change_to_blue
self.class.new(user_id,'blue')
end
end
和
foo = Foo.last
foo.color = "yellow"
foo.bar = foo.bar.change_to_blue
puts foo.color