2017-06-22 13 views
0

Angenommen, ich habe zwei Tabellen, trees und apples und eine verbundene Tabelle tree_apples. Nehmen wir an, die Tabelle tree_apples enthält einige wichtige Spalten mit den Namen rotten (boolean) und branch (int).Rails update_nested_attributes. HOw update falls vorhanden, create wenn nicht?

Say in der Steuerung für trees, ich habe dies:

@tree.update_nested_attributes(tree_params) und meine tree_params Methode, dies wie folgt aussehen:

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

Sagen Sie den Baum, dass ich die Aktualisierung bereits eine tree_apple mit einer ID hat von 3, das ist rotten: true und branches: nil und die eingehenden Parameter in diesen Controller, um den Zweig zu aktualisieren, hat Parameter, die wie folgt aussehen:

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

Also ist es params zu erstellen oder zu aktualisieren eine Reihe von tree_apples. Die Seite, von der die Parameter kamen, möchte den Zweig für tree_apple aktualisieren, der auf apple_id von 3 verweist, und für diesen tree_apple gibt es keine Eingabe über den veralteten Zustand. Ich möchte nicht ein weiteres tree_apple erstellen, das apple_id: 3 referenziert, das nil für den faulen_state hat. Ich möchte das vorhandene tree_apple aktualisieren. Also, für diese tree_apple, würde ich es gerne finden, und dann Update es mit Zweig 5. Aber für alle anderen Parameter, die Äpfel, die nicht auf diesem Baum existieren, referenzieren möchte ich erstellen neu tree_apples wenn die tree_apple nicht existiert.

Gibt es eine Möglichkeit, dies zu tun? Gehört diese Logik als Callback in den Controller oder in das Modell?

Antwort

0

Blick in find_or_create_by

Etwas entlang der Linien von:

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 

in Ihrem Controller.

+0

@jwan haben, dass Ihr Problem lösen? – George

0

Sie müssen die ID des tree_apple Datensatzes übergeben, wenn Sie diese z.

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 
}, 
... 
] 

Und damit natürlich die ID in Ihrem params:

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

Können Sie 'tree_apples' durch ein anderes Attribut außer id aktualisieren? Können Sie den Schienen mitteilen, dass sie aktualisieren sollen, solange die 'apple_id' gleich ist? – Jwan622

+0

Wenn Sie die ID nicht übergeben, müssen Sie den Datensatz finden, um ihn zu aktualisieren, wie @ George in seiner Antwort vorgeschlagen hat –

Verwandte Themen