0

Rails 3.2アプリがあり、モデルが1つあります。これを、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

問題は、車とオプションを提案するためのアルゴリズムが、明確ではない実際の車のレコードを返す可能性があることです。たとえば、提案された車に対する1つのリクエストでは、革張りのシートを備えた車Aと車Aの両方を返すことができます。しかし、問題があります。アクティブレコードから同じエンティティの2つを同時に要求すると、両方のインスタンスが同じオブジェクトを参照するためです。つまり、異なる一時データを持つことはできません。

その場合、オブジェクトをコピーするために.dupメソッドを使用する必要があるのではないかと思いますが、もっと洗練された解決策があるように感じます。私はどんな提案にもオープンです。このタイプの状況を処理する一般的な方法はありますか?

4

1 に答える 1

2

問題は、1つに強制しようとしている2つの異なるものがあることです。1つは車種のリストです。もう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 に答える