Ruby on rails 如果存在按id查找,如何执行查找,否则如何执行按列名称查找或初始化(params[:somevalue])

Ruby on rails 如果存在按id查找,如何执行查找,否则如何执行按列名称查找或初始化(params[:somevalue]),ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我试图允许人们在知道id的情况下直接更新记录,或者输入名称/地址类型的信息,如果不存在记录,它将找到正确的记录或创建新的记录 @provider=provider。通过公司查找或初始化(参数[:provider]) 只要输入的记录包含所有必要的列(如果我通过csv文件读取此信息,则会显示这些列),上述操作就可以正常工作 但是现在我想提供一个选项,只包括一个ID,如果它确实存在于数据库中,就使用它。如果没有,我将运行上面的语句来查找这些列或创建一个新记录 我的控制器如下: def cr

我试图允许人们在知道id的情况下直接更新记录,或者输入名称/地址类型的信息,如果不存在记录,它将找到正确的记录或创建新的记录

@provider=provider。通过公司查找或初始化(参数[:provider])

只要输入的记录包含所有必要的列(如果我通过csv文件读取此信息,则会显示这些列),上述操作就可以正常工作

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

我的控制器如下:

      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
但是,如果我将数据放在company字段而不是ID字段中,则会出现错误


我确信有一种巧妙的方法可以做到这一点,但我还没有看到。如果记录已经存在,您通常会将表单提交路由到控制器的
更新
操作

然而,如果您想在
创建
操作中处理这种情况,您只需要知道哪个参数具有施主id。我猜一下,它可能
参数[:施主][:id]
。如果是这种情况,那么这将起作用:

@donor = Donor.find_by_id(params[:donor][: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的记录。如果它返回一条记录,则
@provider
被设置为该记录,并且块不会运行。如果没有,那么它将返回
nil
(使用
find_by_id()
而不是
find()
,这一点很重要,因为
find()
在没有找到记录的情况下会引发错误),并且块将运行,使用参数将
@donor
设置为记录(新的或不是)

希望这能回答你的问题