composed_of更新ActiveRecord属性



对象示例:

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

相关内容

  • 没有找到相关文章

最新更新