1, "quantity"=> 3.5}-6ren">
gpt4 book ai didi

ruby - 多对多 : how to prevent duplicates? 上的 Rails 嵌套表单

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:24 26 4
gpt4 key购买 nike

我在我的 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,IngredientLine 与 {"measurement_unit_id"=> 1, "ingredient_id"=> 1, "quantity"=> 3.5} 关联,如果对于 recipe_5,IngredientLine 子表单由用户编译相同的值,我不希望在 IngredientLine 表上有新记录,而只希望在连接表 ingredient_lines_recipes 中有新的关联记录。

请注意,目前我没有任何 IngredientLine Controller ,因为保存和更新 IngredientLines 是由嵌套的表单例程处理的。甚至我的 Recipe Controller 也是普通和标准的:

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

我的猜测应该足以使用 find_or_create 覆盖 IngredientLine 的标准 create 行为,但我不知道如何实现它。

但是还有一个重要的点需要注意,想象一下编辑一个存在一些 IngredientLines 的子表单,如果我添加另一个 IngredientLine,它已经存储在 IngredientLine 表中,rails 当然不应该在 IngredientLine 表上写任何东西,但也应该区分已经关联到父级的子记录,以及需要为其创建关系、在连接表上写入新记录的新子记录。

谢谢!

最佳答案

在Recipe模型中重新定义方法

def ingredient_lines_attributes=(attributes)
self.ingredient_lines << IngredientLine.where(attributes).first_or_initialize
end

关于ruby - 多对多 : how to prevent duplicates? 上的 Rails 嵌套表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10717797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com