我有一个简单的序列化器,其中属性的处理取决于另一个属性的处理。
所以我的代码如下:
class CounterSerializer < ActiveModel::Serializer
attribute :CounterId do
object.id
end
attribute :CounterValue do
@value = SomeClass.get_counter_value(object.id)
end
attribute :NextCounterValue do
@value + 1
end
end
因此,假设我在两个属性中使用了@value
,而第二个属性的值取决于第一个属性的输出,我是否可以假设CounterValue
将在之前计算 NextCounterValue
? (即没有异步计算问题)
还请记住,NextCounterValue
不应再调用SomeClass.get_counter_value
(性能问题)
答案 0 :(得分:1)
我想您的代码应该有效,但是如果您想确保自己的代码可以工作,我建议您使用memoization。
class CounterSerializer < ActiveModel::Serializer
attributes :counterId, :counterValue, :nextCounterValue
def counterId
object.id
end
def counterValue
@value ||= SomeClass.get_counter_value(object.id)
end
def nextCounterValue
counterValue + 1
end
end
由于使用了记忆,此代码不会再调用SomeClass.get_counter_value
,因此您可以确保代码的行为像您想要的那样。