2016-10-08 43 views
0

在網上商店我有一個預訂,需要知道訂單中是否存在訂單。我有整個事情工作,但後來的細節...Rails創建連接表對象不應該創建,但在特殊情況下更新

...現在'預訂產品'(或在正常的英語:添加產品到您的購物車)增加了一個全新的預訂在每種情況下的訂單清單。它不應該在這個產品已經預訂過一次,那麼它只應該改變數量。

那麼容易吧?只是一個簡單的if語句和整個事情的作品。

bookings_controller.rb

def create 
    @order = current_order 
    # If product has already been booked 
    if @order.bookings.where(product_id: params[:product_id]).exists? 
     # Then: Only alter the quantity in the booking. 
     @booking = @order.bookings.where(product_id: params[:product_id]) 
     @booking.product_quantity = params[:product_quantity] 
    else 
     # Else: Make a new booking. 
     @booking = @order.bookings.new(booking_params) 
     @product = @booking.product 
     @booking.product_name = @product.name 
     @booking.product_price = @product.price 
    end 
    @order.sum_all_bookings 
    @order.save 
    end 

    # ... 

    def booking_params 
    params.require(:booking).permit(:product_quantity, :product_id) 
    end 

似乎並沒有工作。

如何在if語句中進行檢查? 或者我應該走一條完全不同的路線來更新預訂?

編輯

我已經在這個形狀gmcnaughton答案後,嘗試各種組合。我得到多個條目仍然或根本沒有條目。這一個根本沒有給我任何條目。

bookings_controller.rb

def create 
    @order = current_order 
    @booking = @order.bookings.find_or_create_by(product_id: params[:product_id]) 
    product = @booking.product 
    if @booking.new_record? 
     @booking.product_name = product.name 
     @booking.product_price = product.price 
    else 
    @booking.product_quantity = params[:product_quantity] 
    @booking.save 
    @order.sum_all_bookings 
    @order.save 
    end 

我應該也控制了預訂id可能?但這沒有意義,因爲在找到現有預訂的情況下,它應該已經在那裏了。

這可能是我通過remote: true form解僱了預訂嗎?

編輯2

而且不工作:

bookings_controller.rb

def create 
    @order = current_order 
    @booking = @order.bookings.where(product_id: params[:product_id]).first_or_initialize 
    if @booking.new_record? 
     @booking.product_id = params[:product_id] 
     product = @booking.product 
     @booking.product_name = product.name 
     @booking.product_price = product.price 
    else 
    @booking.product_quantity = params[:product_quantity] 
    @booking.save 
    @order.sum_all_bookings 
    @order.save 
    end 

編輯3

也許這已經得到的東西,用它做:

categories_controller.rb /店

def index 
    @categories = Category.all.order(name: :asc) 
    # Voor het inzien van wat al geselecteerd is. 
    @order = current_order 
    # Voor het aanslaan van een nieuwe booking. 
    @booking = current_order.bookings.new 
    end 

這基本上勾畫出了整個初始店。 @booking是爲了構建每種產品的形式。

繼工作:

def create 
    @booking = @order.bookings.find_by(product_id: params[:booking][:product_id]) 
    if @booking 
     @booking.product_quantity = params[:booking][:product_quantity] 
     @booking.save 
    else 
     @booking = @order.bookings.new(booking_params) 
     @product = @booking.product 
     @booking.product_name = @product.name 
     @booking.product_price = @product.price 
    end 
    @order.save 
    end 

顯然,我需要搶參數,可以通過添加[:booking]params[:booking][:product_id]。任何人都知道爲什麼?

回答

0

的想法是正確的,但我認爲你缺少.first呼叫:

@booking = @order.bookings.where(product_id: params[:product_id]) 
    => #<ActiveRecord::Relation> 

應該是:

@booking = @order.bookings.where(product_id: params[:product_id]).first 
    => #<Booking> 

......否則你要更新的關係,而不是一個Booking模型。修改後,您可能還想調用@booking.save

另外,ActiveRecord的也有first_or_initializefirst_or_create傭工這讓你找到一個匹配的實例或建立/創建一個新:

@booking = @order.bookings.where(product_id: params[:product_id]).first_or_initialize 
if @booking.new_record? 
    @product = @booking.product 
    ...other stuff for new record... 
else 
    @booking.product_quantity = params[:product_quantity] 
end 
@booking.save 
+0

我與您的解決方案的工作,但無論我試過至今讓我結束與多個條目。 –

+0

我上次編輯後的任何想法?我用你的想法,它應該工作,它更加優雅...但它還沒有。 –

+0

'find_or_create_by'和'new_record?'不會在一起玩 - 如果find創建一個新模型,它將會有一個id,所以'new_record?'將會是false。 '@ order.bookings.where(...)。first_or_initialize'不工作嗎? – gmcnaughton

相關問題