2011-04-26 39 views
0

我正在使用一個rails-2.3應用程序,它使用composed_of創建知道如何對地址進行自我編碼的Address類。這一切都很好,但是給定一個有地址的加載模型,當我更改模型中地址組成的字段時,地址實例既不會自動更改也不會自動重新創建,而且我恐怕無法找出最強有力的方式來實現這一目標。如何使composit值對象更新或當其字段更改時重新創建它自己?

型號代碼很簡單:

class Model < ActiveRecord::Base 

    composed_of :address, :mapping => [%w(address1 address1), %w(address2 address2), %w(city city), %w(state state), %w(postal_code postal_code), %w(country_code country), %w(longitude lng), %w(latitude lat)] 

end 

有什麼建議?

我隨後回答了這一點,但已經不能回答我的問題,所以這裏有雲:

事實證明,composed_of創建有一個(無證)force_reload參數讀取方法。我利用這一點,並創建存取方法爲每個組成字段:

composed_of :address, :mapping => ADDRESS_MAPPING              
    ADDRESS_MAPPING.each do |field, composed_field|               
    next if %w(latitude longitude).include?(field)              
    define_method "#{field}=" do |value|                 
     self[field] = value                     
     if send("#{field}_changed?")                  
     self[:longitude] = nil                   
     self[:latitude] = nil                    
     address(true)                      
     end                         
    end                         
    end                          

這是一個有點做作,但它的作品。

我可能會看到有關此因素的變化?檢查基於composer_of reader的方法。

+0

剛編輯我的答案,我喜歡挑戰;) – apneadiving 2011-04-26 20:15:49

回答

1

你既可以reload您手動變量:

@my_variable.reload 

或使其在after_save回調發生(在你的模型。)。

編輯:

你可以做到以下幾點:

@my_variable.clear_aggregation_cache 

(當然它包裝在一個回調)

見模塊ActiveRecord::Aggregations

+0

雖然這是相當低效。它只是爲了重新創建一個由已經存在於內存中的字段組成的值對象而向數據庫添加不必要的行程。我相信我能做得比這更好。 – 2011-04-26 18:23:21

+0

好的,讓我們找到更好的東西! – apneadiving 2011-04-26 18:45:06

0

您可以自定義一個轉換器,然後直接將自定義數據分配給:address屬性。

相關問題