gpt4 book ai didi

ruby-on-rails - 使用连接表创建方法 - 拥有并属于许多

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

好的,我有一个问题。我尝试将一些 ingredient_id 添加到我的数据库中,但我不知道该怎么做。

在我的 Controller 中我有创建方法

def create
@drink = Drink.new(drink_params)
@ingredient = Ingredient.find(params[:id])
if @drink.save
@drink.ingredients << @ingredient
redirect_to drinks_path
else
render 'new'
end
end

然后我有错误:找不到没有 ID 的成分。

但是当我将 @ingredient = Ingredient.find(params[:id]) 更改为 @ingredient = Ingredient.all 时,一切正常。但我不想把我所有的原料都加到饮料里,只是其中的一些。

任何人都可以帮助我并逐步解释吗?我将不胜感激。

最佳答案

为了节省配料和饮料,您需要添加 accepts_nested_attributes_for到您的 Drink 模型:

# app/models/drink.rb

class Drink < ActiveRecord::Base
accepts_nested_attributes_for :ingredients
...
end

然后在 Controller 的 drink_params 方法中添加 ingredients_attributes 作为允许的参数属性。配料的字段集取决于您的实现。例如,如果您想要一个 UI,用户可以在其中输入成分名称,并且仅当数据库中还没有这种成分时才会为该成分创建新记录,那么您需要查找 ingrediends 表并将 id 添加到 ingredients_attributes:

# app/controllers/drinks_controller.rb

class DrinksController < ApplicationController
def create
@drink = Drink.new(drink_params)
if @drink.save
redirect_to drinks_path
else
render 'new'
end
end

private

def drink_params
params.require(:drink).permit(:name, ingredients_attributes: [:name]).tap do |p|
p[:ingredients_attributes].each do |i|
ingredient = Ingredient.find_by(name: i[:name])
i[:id] = ingredient.id if ingredient
end
end
end
end

关于ruby-on-rails - 使用连接表创建方法 - 拥有并属于许多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52751105/

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