返回一组具有不同瞬态属性的非同质记录

时间:2012-07-21 19:17:34

标签: ruby ruby-on-rails-3

我有一个Rails 3.2应用程序,我有一个型号,我们称之为Car。

用户输入一系列信息,应用程序根据该信息返回建议车辆列表。现在,每辆车都有一组用户可能想要或不想要的瞬态属性,例如建议的室内装潢,建议的颜色等。这些“建议”属性是根据用户输入的信息动态计算的。因此,应用程序不仅会猜测用户可能想要的车辆,还会猜测用户可能需要的其他选项,并将该信息暂时存储在Car记录中。

这是Car模型相关部分的伪编码表示:

def self.suggested_cars
  @cars = basic_cars(user_height, user_weight)
  add_upholstery_suggestions(@cars, user_wealth)
  add_color_suggestions(@cars, user_gender)
end

问题是建议汽车和选项的算法可以返回不同的实际汽车记录。例如,建议汽车的一个请求可以返回带有真皮座椅的A车和A车。但后来我遇到了一个问题,因为当同时从活动记录中请求两个相同的实体时,两个实例都引用同一个对象,即它们不能有不同的瞬态数据。

我怀疑在发生这种情况时我可能需要使用.dup方法来复制对象,但我觉得有更优雅的解决方案。我愿意接受任何建议。是否有一种常见的方法来处理这种情况?

1 个答案:

答案 0 :(得分:2)

问题在于你有两件不同的东西,你试图强迫它们。一个是汽车类型列表;另一个是汽车配置列表。汽车配置有一种车型。汽车类型有许多配置。

通过将它们分成两个不同的类来修复,例如:

class Car < ActiveRecord::Base
  def self.basic_cars(user)
    # returns a relation
  end
end

class CarConfig
  attr_accessor :car, :opts

  def initialize(car, opts)
    @car, @opts = car, opts
  end

  def self.suggested_configs
    configs = []
    Car.basic_cars(user).each do |car|
      configs << upholstery_suggestions(car, user)
      configs << color_suggestions(car, user)
    end
    configs.flatten
  end

  def self.upholstery_suggestions(car, user)
    [self.new(car, seats: 'standard'), 
     self.new(car, seats: 'leather')]
  end
end