2013-03-19 66 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