gpt4 book ai didi

ruby-on-rails - 如果存在,我该如何按 id 查找,否则执行 find_or_initialize_by_columname(params[ :somevalue])

转载 作者:行者123 更新时间:2023-12-03 22:40:21 24 4
gpt4 key购买 nike

我试图让人们在知道 ID 或输入名称/地址类型的信息时直接更新记录,如果不存在,它将找到正确的记录或创建一个新记录。

@donor = Donor.find_or_initialize_by_company_and_prefix1_and_first_name1_and_last_name1_and_address1(params[:donor])

只要输入的记录包含所有必要的列(如果我通过 csv 文件读取此信息,它就会这样做),上面的工作就很好。

但现在我想提供仅包含一个 ID 的选项,如果它确实存在于数据库中则使用它。如果没有,我会运行上面的语句来查找那些列或创建一个新记录。

我的 Controller 如下:

      def create
# need to find donor by id if given, else use find_or_create_by_blahblahblah

@donor = Donor.find_or_initialize_by_company_and_prefix1_and_first_name1_and_last_name1_and_address1(params[:donor])


if @donor.new_record?
@donor.save
respond_to do |format|
if @donor.save
format.html { redirect_to @donor, notice: 'Donor was successfully created.' }
format.json { render json: @donor, status: :created, location: @donor }
else
format.html { render action: "new" }
format.json { render json: @donor.errors, status: :unprocessable_entity }
end
end
else
respond_to do |format|
if @donor.save
format.html { redirect_to @donor, notice: 'Donor already exists. Please edit donor if needed.'}
format.json { render json: @donor, status: :created, location: @donor }
else
format.html { render action: "new" }
format.json { render json: @donor.errors, status: :unprocessable_entity }
end
end
end

end

如果提供了 ID 来检查它,我找不到该怎么做。

我试过类似的方法:

@donor = Donor.find_by_id(params[:donor])
if !@donor
@donor = Donor.find_or_initialize_by_all_those_columns(params[:donor])
end

但是如果我将数据放入公司字段而不是 ID 字段,这会给我一个错误。

我确信有一种巧妙的方法可以做到这一点,但我还没有见过。如有任何帮助,我们将不胜感激。

最佳答案

试试这个:

unless @donor = Donor.find_by_id(params[:donor][:id]) // returns `nil` if record not found
@donor = Donor.find_or_initialize_by_all_those_columns(params[:donor])
end

@donor.new_record? ...

第一行查找带有传入 ID 的记录。如果它返回一条记录,则将 @donor 设置为该记录,并且不会运行该 block 。如果没有,那么它会返回 nil(使用 find_by_id() 而不是 find() 因为这个原因很重要,因为 find () 如果没有找到记录会引发错误),并且将运行该 block ,将 @donor 设置为带有参数的记录(无论是否新)。

希望这能回答您的问题。

关于ruby-on-rails - 如果存在,我该如何按 id 查找,否则执行 find_or_initialize_by_columname(params[ :somevalue]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7681349/

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