2016-11-17 50 views
1

有人可以看看我的代碼,並讓我知道是否有更好的方法來做到這一點,或者甚至糾正我要錯誤的地方嗎?我正在嘗試爲每個場地和變體創建一個新的行。Rails保存數組以分隔數據庫中的行

例子:

venue_ids => ["1","2"], variant_ids=>["10"] 

所以,我希望在具有venue_id of 1添加一行,與variant_id of 10。和一個venue_id of 2,與variant_id of 10

我得到了這個工作,它現在傳入我的兩個數組。我認爲我幾乎在那裏我不確定.each是正確的方式,但我認爲我在正確的軌道上哈哈。但是,我提交了,我在哪裏可以放@back_bar.save?因爲這可能會導致問題,因爲它不會重定向

在此先感謝。

def create 
    @back_bar = BackBar.new 
    @venues = params[:venue_ids] 
    @productid = params[:product_id] 
    @variants = params[:variant_ids] 

    # For each venue we have in the array, grab the ID. 
    @venues.each do |v| 
    @back_bar.venue_id = v 
    # Then for each variant we associate the variant ID with that venue. 
    @variants.each do |pv| 
     @back_bar.product_variant_id = pv 

     # Add in our product_id 
     @back_bar.product_id = @productid 
     # Save the venue and variant to the DB. 

     if @back_bar.save 
     flash[:success] = "#{@back_bar.product.name} has been added to #{@back_bar.venue.name}'s back bar." 
     # Redirect to the back bar page 
     redirect_to back_bars_path 
     else 
     flash[:alert] = "A selected variant for #{@back_bar.product.name} is already in #{@back_bar.venue.name}'s back bar." 
     # Redirect to the product page 
     redirect_to discoveries_product_path(@back_bar.product_id) 
     end 
    end # Variants end 
    end # Venues end 
end 

private 

    def back_bar_params 
    params.require(:back_bar).permit(:venue_id, 
            :product_id, 
            :product_variant_id) 
    end 
+1

咦?你正在覆蓋同一條記錄。你沒有創建多個記錄。 –

+1

你真的需要學會寫苗條的控制器。 你應該製作一個模型方法,你只需要在ID中輸入。對於那種情況,你也可以爲它寫一個測試並確保它的工作。 我也會用大量的sql語句來做這件事,而不是使用AR來做這件事。想象你有20x20 ids。所以你做1聲明而不是400 –

+0

@huanson這就是我想要做的,你知道任何教程可以幫助我嗎? – Alan

回答

2

正如我在評論說

這是未經測試的代碼,並只是顯示你怎麼可能輕鬆做到。

class BackBar 

    def self.add_set(vanue_ids, variant_ids) 
    values = vanue_ids.map{|ven| 
     variant_ids.map{|var| 
     "(#{ven},#{var})" 
     } 
    }.flatten.join(",") 

    ActiveRecord::Base.connection.execute("INSERT INTO back_bars VALUES #{values}") 
    end 
end 

def create 
    # use in controller 
    BackBar.add_set(params[:venue_ids], params[:variant_ids]) 

    # ... 
end 
+1

哦謝謝! @ huanson這是非常感謝和一個偉大的起點。 那麼在那裏使用SQL插入就好了? – Alan

+2

當然是。這就是爲什麼我們可以做到這一點。就像我說的。想象你有50x50的價值。你想做2.500個SQL語句,或者只是一個單一的mass-insert?您現在也可以測試您的模型行爲並編寫單元測試,調用該方法並查看它是否創建了預期的列數 –

+1

非常感謝:D – Alan

相關問題