【问题标题】:How to create a new record or update if a particular record based on an attribute other than record id exists, Ruby on Rails?如果存在基于记录 ID 以外的属性的特定记录,如何创建新记录或更新,Ruby on Rails?
【发布时间】:2012-08-17 20:26:28
【问题描述】:

我有 2 个模型类,员工和公司。外部库仅生成员工 ID。如果他的详细信息已经存在,我正在尝试更新员工详细信息,否则我需要创建新的员工详细信息。下面是create方法的代码:

def create

 if !@emp= Details.find_or_create_by_emp_id(params[:details][:emp_id])
    @emp = Details.new(params[:details])

  // some logic goes here 


  else
    @emp.update_attributes(params[:details])
    render action: "show"
  end      
end

但这总是使用现有的 emp_id 创建一条新记录,而不是更新与特定 emp_id 相关的表行。如何让它发挥作用?

【问题讨论】:

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


    【解决方案1】:

    你可以试试这个:

    def create
      @emp = Details.find_by_emp_id(params[:details][:emp_id])
    
      if @emp
        @emp.update_attributes(params[:details])
        render action: "show"
      else
        @emp = Details.new(params[:details])
        //other stuff
      end
    end
    

    所以如果员工已经存在,它被设置为@emp,否则@emp 被设置为nil

    【讨论】:

    • Details.find_by_emp_id(params[:details][:emp_id]) 评估结果不正确,语法是否正确?
    • 你可以试试@emp = Details.where("emp_id = ?", params[:details][:emp_id])然后把if语句改成if @emp.any? @emp.first.update_attributes.....
    • 不,我不确定 update_attributes 是正确的方法。它仍然为相同的 emp_id 创建更新的员工详细信息行
    【解决方案2】:

    您使用 find_or_create 错误。它需要标识符和哈希:

     if Detail.find_or_create_by_emp_id(params[:detail][:emp_id], params[:detail])
       #success
     else
       #fail
     end
    

    注意:您的模型名称和参数似乎都是复数,这违反惯例,您确定这是您的意图吗?

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 2018-10-16
      • 1970-01-01
      相关资源
      最近更新 更多