2012-09-05 106 views
4

定義依賴另一個方法設置的虛擬setter方法時,似乎在哈希中設置的屬性的順序很重要。有沒有辦法解決這個問題,同時仍然可以批量分配屬性?設置Rails模型屬性的順序

https://gist.github.com/3629539

EDIT

在真實代碼的條件,而不是在所示的例子中,被檢查的相關聯的對象的存在。如果該對象存在,請設置一個值。如果不是,則忽略傳入的值。但是,我也使用了accep_nested_attributes_for。所以,哈希屬性可能包含關聯的屬性。在這種情況下,該對象將存在。

{:name => 'Fred', :nested_attributes => {:color => 'red'}} 

名稱將不會被設置,因爲模型將不存在。

{:nested_attributes => {:color => 'red'}, :name => 'Fred'} 

accept_nested_attributes_for將構建一個嵌套實例,然後設置屬性。當要設置名稱時,該實例將存在並且將設置嵌套屬性。

+0

Ew;你確定這是最好的方式嗎?不知道你的上下文,但用模型回調處理這個問題可能更有意義嗎? –

+0

你能舉個例子嗎? – efoo

回答

0

我現在能想到的唯一的解決辦法是重寫屬性二傳手...

def attributes=(attrs) 
    self[:dont_set_name] = attrs.delete(:dont_set_name) 
    super 
end 
+0

這是我所能想到的 – efoo

2

也有類似的問題,我來到了以下合理通用的解決方案:

def assign_attributes(new_attributes) 
    assign_first = new_attributes.extract!(:must_be_set_first, :must_also_be_set_first) 
    super(assign_first) unless assign_first.empty? 
    super(new_attributes) 
end 

使用super以及需要設置的提取參數值,可以確保您處理屬性賦值的所有奇怪特殊情況(它是參考嗎?參數?參數?多值參數?)。重複調用assign_attributes與散列的部分確實應該具有與用整個散列調用它相同的效果 - 這應該是相當安全的。