2012-11-26 74 views
3

是否有一種類似於update_attributes的內置方法會忽略作爲參數傳入的散列中的無效密鑰?如果沒有,處理髮送可能包含或不包含有效密鑰的散列的情況的最佳方式是什麼?ActiveRecord update_attributes忽略無效密鑰

+1

通過「有效的鑰匙」,你的意思「一個表示模型現有屬性的符號(不會引發未定義的方法)」或「a key =>值對」,它將通過驗證「? 「 – pje

+0

」表示模型現有屬性的符號(不會引發未定義的方法)「 – 0xSina

+0

如果符合您的問題@ 0xSina – MrYoshiji

回答

1

我不知道任何能夠在Rails中完成這項功能的東西。我也沒有意識到一個簡單的方法來確定模型的「定義的屬性」是什麼 - 因爲模型可能會覆蓋setter,虛擬屬性等。每當我需要這個功能時,我只是明確定義可接受的符號類中的一個列表,像這樣:

class Foo < ActiveRecord::Base 
    def defined_attributes 
    [ :a, :b, :c ] 
    end 
end 

...然後,後來在某種過濾步驟的使用:

attrs = { :a => 1, :z => 0 } 
    foo.update_attributes(attrs.slice(*foo.defined_attributes)) 
1

一個選項是運行obj.valid?並在調用update_attributes之前刪除無效的鍵(來自obj.errors數組的那些鍵)。

def update_valid_attributes(o) 
    o.errors.messages.each do {|k,msg| o.delete k} if !o.valid? 
    o.update_attributes 
end 

,如果你想在你的所有堅持實體也可以將此方法添加到的ActiveRecord :: Base的。

+0

」有效鍵「:」代表模型(不會引發未定義的方法)「我認爲OxSina正在尋找一種方法來刪除不是模型屬性的參數。我對@OxSina? – MrYoshiji

+0

@OxSina在這種情況下,請使用Mroshi的解決方案。 – buftlica