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