find_or_create_by在多个创建动作中?

时间:2013-03-19 15:42:01

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

我可以使用下面的create methode一次创建多个记录:

  def create    
    rate_price = params[:rate][:rate]
    mlos = params[:rate][:mlos]

    start_date = Date.parse(params[:start_date])
    end_date = Date.parse(params[:end_date])

    dates = (start_date..end_date).to_a.select {|k| (params[:rate][:days]).reject(&:blank?).map(&:to_i).include?(k.wday)}
    room_ids = params[:rate][:room_ids].reject(&:blank?).map(&:to_i)

    @rates = []
    dates.zip(room_ids).each do |date, room_id|
      rate = Rate.new(:rate => rate_price, :mlos => mlos, :room_id => room_id, :dayrate => date )
      #rate = Rate.find_or_create_by_dayrate(date, :rate => rate_price, :mlos => mlos, :room_id => room_id)

      @rates << rate
    end

    @rates.map(&:save)

    respond_to do |format|
      if @rates.any? { |rate| !rate.persisted? } 
        format.html { render action: "new" }
        format.json { render json: @rates.detect { |rate| !rate.persisted? }.errors, status: :unprocessable_entity }
      else
        format.html { redirect_to :back, notice: 'Rates were successfully created.' }
        format.json { render json: @rates, status: :created, location: @rates }
      end
    end
  end

但是当我想使用find_or_create_by(我的代码中的注释行)创建或更新记录(如果它们已经存在)时,似乎没有记录更新,只有创建有效。 知道我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

在调用方法时,find_or_create_by仅在您要创建新记录时使用。根据我对您的代码的理解,您希望使用dayrate(日期列)创建费率。而且由于你的问题是为什么记录没有更新,我假设你想要更新记录,如果它们已经在数据库中。您可以使用以下代码实现此目的

rate = Rate.where(dayrate: date).first_or_initialize
rate.attributes = { rate: rate_price, mlos: mlos, room_id: room_id }

这将确保费率的属性将使用您通过验证时传递的值(因为您在阻止后调用map(&:save)