Ruby on Rails-属性顺序在ActiveModel:Serializer中是否重要?

时间:2019-04-12 12:47:55

标签: ruby-on-rails active-model-serializers

我有一个简单的序列化器,其中属性的处理取决于另一个属性的处理。

所以我的代码如下:

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(性能问题)

1 个答案:

答案 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,因此您可以确保代码的行为像您想要的那样。