如果存在,我如何通过id进行查找,否则执行find_or_initialize_by_columname(params [:somevalue])

时间:2011-10-06 22:48:24

标签: ruby-on-rails ruby-on-rails-3

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

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

只要输入的记录包含所有必要的列(如果我通过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

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

我确信有一种光滑的方式可以做到这一点,我还没有看到。任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

如果记录已经存在,您通常会将表单提交路由到控制器的update操作。

尽管如此,如果您想要处理create操作中的情况,您只需要知道哪个参数具有捐赠者ID。我会猜测并说它可能params[:donor][:id]。如果是这样,那么这将起作用:

@donor = Donor.find_by_id(params[:donor][:id])

查看表单参数以找出正确的名称。

答案 1 :(得分:3)

试试这个:

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设置为该记录,并且该块不会运行。如果没有,那么它将返回nil(因为这个原因,使用find_by_id()代替find()非常重要,因为如果没有找到记录,find()会引发错误,并且将运行块,使用参数将@donor设置为记录(新的或不是新的)。

希望这能回答你的问题。