2013-03-19 61 views
0

我能够立刻使用下面的创建梅索德创建多个记录:find_or_create_by在多个创建操作中?

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

作为该方法的调用,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)你传递的价值观。

+0

是你把我弄对了!这只是做了伎俩,谢谢 – thesubroot 2013-03-19 15:57:54