Rails 3.2.3 アプリでネストされたフォームをセットアップしました。正常に動作しています。モデルは次のとおりです。
class Recipe < ActiveRecord::Base
attr_accessible :title, :description, :excerpt, :date, :ingredient_lines_attributes
has_and_belongs_to_many :ingredient_lines
accepts_nested_attributes_for :ingredient_lines
end
と:
class IngredientLine < ActiveRecord::Base
attr_accessible :ingredient_id, :measurement_unit_id, :quantity
has_and_belongs_to_many :recipes
belongs_to :measurement_unit
belongs_to :ingredient
end
上記のように、Recipe には複数の IngredientLines を含めることができ、その逆も可能です。
私が避けようとしているのは、IngredienLine テーブルでのレコードの重複です。
たとえば、recipe_1 では {"measurement_unit_id" => 1, "ingredient_id" => 1, "quantity" => 3.5} の IngredientLine が関連付けられていると想像してください。recipe_5 では IngredientLine 子フォームがユーザーによって同じ値でコンパイルされます。 、IngredientLine テーブルに新しいレコードは必要ありませんが、結合テーブルの新しい関連レコードだけが必要です。
現在、IngredientLines の保存と更新はネストされたフォーム ルーチンによって処理されるため、IngredientLine コントローラーはありません。私の Recipe コントローラーでさえ、単純で標準的です。
class RecipesController < ApplicationController
respond_to :html
def new
@recipe = Recipe.new
end
def create
@recipe = Recipe.new(params[:recipe])
flash[:notice] = 'Recipe saved.' if @recipe.save
respond_with(@recipe)
end
def destroy
@recipe = Recipe.find(params[:id])
@recipe.destroy
respond_with(:recipes)
end
def edit
respond_with(@recipe = Recipe.find(params[:id]))
end
def update
@recipe = Recipe.find(params[:id])
flash[:notice] = 'Recipe updated.' if @recipe.update_attributes(params[:recipe])
respond_with(@recipe)
end
end
create
私の推測では、 IngredientLineの標準的な動作を でオーバーライドするには十分なはずですが、find_or_create
それを実現する方法がわかりません。
しかし、注意すべきもう 1 つの重要な点があります。いくつかの IngredientLines が存在する子フォームの編集を想像してください。すでに IngredientLine テーブルに格納されている別の IngredientLine を追加すると、レールはもちろん IngredientLine テーブルに何も書き込むべきではありませんが、すでに親に関連付けられている子レコードと、リレーションを作成する必要がある新しい子レコードを区別し、結合テーブルに新しいレコードを書き込みます。
ありがとう!