0

我有一个 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 方法来复制对象,但我觉得有一个更优雅的解决方案。我愿意接受任何建议。有没有一种通用的方法来处理这种情况?

4

1 回答 1

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
于 2012-07-21T19:52:38.497 回答