2012-07-21 43 views
0

我有一個Rails 3.2應用程序,我有一個模型,我們稱之爲Car。返回一組具有不同瞬態屬性的非獨立記錄

用戶輸入一系列信息,並根據該信息返回建議汽車列表。現在,每輛車都有一組用戶可能或不想要的瞬態屬性,例如建議的室內裝潢,建議的顏色等。這些「建議」屬性是根據用戶輸入的信息即時計算的。因此,不僅應用程序能夠猜測用戶可能需要的汽車,還會猜測用戶可能需要的其他選項,並將這些信息暫時存儲在汽車記錄中。

這是汽車模型的相關部分的pseudocodish表示:

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

爲什麼你就不能瞬時數據附加到'Car'實例?然後當你顯示它時,你可以創建你需要的任何組合。即'Car'或'Car + transient data 1'或'Car + transient data 2'。然後,您不需要複製引用相同數據庫記錄的對象。 – Casper 2012-07-21 19:37:59

回答

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 
+0

我最終做了類似的事情。謝謝! – 2012-07-22 21:36:47