3

可能重複:
Rails update_attributes without save?如何實現一個無的update_attributes實際保存更改

從根本上說,我想做一個ActiveRecord 「update_attributes方法」,而留下的ActiveRecord變更尚待處理。有沒有辦法做到這一點?如果你想知道爲什麼我想要這個,請繼續閱讀。

我有一個由三部分組成的表單:一個靜態部分(相互獨立的文本字段),一組選擇(隨着條目的填充而增長)和一個顯示選擇對組的選擇的影響的部分依賴對象。更改選項需要往返服務器以確定效果,其中一些選擇會影響未來選擇的選擇。這些選擇被建模爲來自基本模型的has_many關聯。例如。 (請注意,[]項指定HTML的選擇)

Include [section] 
    Exclude [subsection] 
    Exclude [subsection] 
Include [section] 
    Exclude [subsection] 
... 

我已設置的形式向上作爲典型的嵌套屬性的形式。當選擇發生變化時,我用AJAX回發這些字段,以便獲取典型的參數散列(例如,params [:basemodel] [associated_models_attributes] [0] [:field_name])。我想把它寫入一個未保存的ActiveRecord中,以便我已經用於生成部分原始頁面的部分可以用來生成JS響應(我爲此使用了一個js.erb文件)。使用Basemodel.new(PARAMS [:basemodel])給出

"ActiveRecord::RecordNotFound (Couldn't find AssociatedModel with ID=1 for Basemodel with ID=) 

這是發生(我認爲),因爲從現有的相關記錄的ID(這在目前的記錄非空白標識)不出錯與來自「新」呼叫的空白ID匹配。

我可以做一些真正的kludgy並創建一些看起來像ActiveRecord的東西(至少足以滿足我的偏好)但我必須認爲這是一個常見問題,以至於有一個很好的解決方案。

+0

爲3.1+,使用'assign_attributes' http://apidock.com/rails/ActiveRecord/Base/assign_attributes – elado

+0

可以使用update_column(名稱,值)更新對象的單一屬性,而無需調用save 。 1.驗證被跳過。 2.回調被跳過。 3.如果該列可用,updated_at/updated_on列不會更新。 http://apidock.com/rails/ActiveRecord/Persistence/update_column – Antoine

回答

7

根據的的ActiveRecord ::#持久性的來源update_attributes方法

# File activerecord/lib/active_record/persistence.rb, line 127 
def update_attributes(attributes) 
    # The following transaction covers any possible database side-effects of the 
    # attributes assignment. For example, setting the IDs of a child collection. 
    with_transaction_returning_status do 
    self.attributes = attributes 
    save 
    end 
end 

您可以通過使用

model.attributes = attributes 

其中屬性屬性分配給你的模型是模型字段等的哈希

+0

工作就像一個魅力。謝謝。下次我會在發佈之前查看來源。 –

4

update_attributes一樣,以下應允許您傳遞模型屬性的子集,而不清除其他屬性以及s默默地忽略散列中的任何未知屬性。它也不應該關心你是否使用字符串或符號作爲你的哈希鍵。

def set_attributes (attributes) 
    attributes.each do |key, value| 
    self.send("#{key}=", value) if self.respond_to?("#{key}=") 
    end 
end 
+0

我認爲這可能會奏效,但請參閱下一個更優雅的解決方案。感謝您的答覆。 –