2017-06-22 121 views
0

說我有兩個表,trees和​​和一個連接表tree_apples。假設tree_apples表有幾個重要列,分別叫做rotten(boolean)和branch(int)。Rails update_nested_attributes。如果存在,HOw會進行更新,如果不存在則創建?

說,在控制器trees,我有這樣的:

@tree.update_nested_attributes(tree_params)和我tree_params方法是這樣的:

tree_apple_params: { 
    :apple_id, 
    :rotten, 
    :branch 
} 

說,我已經更新有tree_apple與ID樹3即rotten: truebranches: nil和傳入參數到此控制器更新分支具有這樣的參數:

tree_apple_params: [{ 
    apple_id: 3, 
    rotten: nil, 
    branch: 5 
    }, 
    { 
    apple_id: 4, 
    rotten: nil, 
    branch: 6 
    }, 
    ... 
] 

所以這是params來創建或更新一堆tree_apples。參數來自的頁面想要更新tree_apple的分支,該分支引用3的apple_id,並且對於此tree_apple,它不提供任何關於腐爛狀態的輸入。我不想創建另一個tree_apple,它引用apple_id: 3對於rotten_state具有nil。我想更新現有的tree_apple。所以,對於這個tree_apple,我想找到它,然後更新它與分支5.但對於參考蘋果,不存在此樹上的所有其他參數,我想創建tree_apples如果tree_apple不存在。

有沒有辦法做到這一點?這個邏輯是否屬於控制器或模型中的某種回調?

回答

0

查找到沿線的find_or_create_by

東西:

tree_params.each do |params| 
    tree_apple = TreeApple.find_or_create_by(apple_id: params[:apple_id]) 
    tree_apple.update_attributes(branch: params[:branch], rotten: params[:rotten]) 
end 

在你的控制器。

+0

@jwan沒有能夠解決問題了嗎? – George

0

如果您要更新記錄,您必須傳遞tree_apple記錄的ID。

tree_apple_params: [{ 
id: 1, #passing the id of the tree_apple record here will update existing records 
apple_id: 3, 
rotten: nil, 
branch: 5 
}, 
{ #passing NO id here will create records 
apple_id: 4, 
rotten: nil, 
branch: 6 
}, 
... 
] 

很顯然允許ID在你的PARAMS:

tree_apple_params: { 
    :id, 
    :apple_id, 
    :rotten, 
    :branch 
} 
+0

你可以通過id以外的任何其他屬性來更新'tree_apples'嗎?你可以告訴rails更新,只要'apple_id'是相同的呢? – Jwan622

+0

如果你沒有通過ID,你必須找到記錄來更新它@George在他的回答中 –

相關問題