2011-06-02 103 views
0

我們通過確保客戶有足夠的物品來運作來開始操作。因此,我們首先收集所有當前項目的數組:記錄沒有顯示在數據庫中

@items = SOrder.where(:user_id => current_user.id).order("order") 

然後我們確定他們應該有多少物品。如果有人有免費賬戶,他們應該有5個項目。如果是付費帳戶,他們應該有20個項目:

if current_user.paid 
    should_have = 19 # one less than 20 because of 0 position in the array 
else 
    should_have = 4 
end 

然後,在情況下,我們需要添加空白的記錄,我們計算出,我們應該開始:

if @items.empty? 
    start = 0 
else 
    start = @items.length + 1 
end 

如果開始是少那麼我們添加空白記錄:

if start <= should_have 
    value = [start .. should_have].each do |v| 
     SOrder.create(:user_id => current_user.id, :order => v, :item_id => 0) 
    end 

    @items = SOrder.where(:user_id => current_user.id).order("order") # reload array 
end 

應該添加的記錄沒有顯示在數據庫中。 錯誤在哪裏?

回答

1

錯誤可能來自一個阿雷爾對象,而不是一個記錄集調用.length

@items = SOrder.where(:user_id => current_user.id).order("order").all 

但是,因爲你只需要一個計數第一個查詢,我建議使用.count。如果我在寫這個我會做這樣的事情:

number_of_items = SOrder.where(:user_id => current_user.id).count 
number_of_blank_items_to_add = current_user.allowed_items - number_of_items 
if number_of_blank_items_to_add > 0 
    number_of_blank_items_to_add.times do |num| 
     SOrder.create(:user_id => current_user.id, :order => (number_of_items + num), :item_id => 0) 
    end 
end 
@str_order = SOrder.where(:user_id => current_user.id).order("order") 

在用戶模式:

​​

更好的

在用戶模式:

has_many :s_orders, :order => "s_orders.order asc" 

def add_extra_blank_orders 
    number_of_items = s_orders.count 
    number_of_blank_items_to_add = allowed_items - number_of_items 
    if number_of_blank_items_to_add > 0 
     number_of_blank_items_to_add.times do |num| 
      s_orders.create(:order => (number_of_items + num), :item_id => 0) 
    end 
end 

def allowed_items 
    if paid 
     20 
    else 
     5 
    end 
end 

在控制器:

current_user.add_extra_blank_orders 
@str_order = current_user.s_orders 

雖然我確信你有一個很好的理由,但我質疑爲什麼空白項目需要在數據庫中。而且,如果在這裏可以使用after_create鉤子。

+0

同意在這裏,型號代碼>控制器代碼 – 2011-06-02 18:41:13

+0

謝謝。我通常在控制器中工作,然後將部件移動到模型中。不知道爲什麼......猜測它只是一個壞習慣。 :=] – Jay 2011-06-02 21:03:56

2

嘗試

value = (start .. should_have).each do |v| 

代替

value = [start .. should_have].each do |v| 

[start .. should_have]將只返回一個陣列,以在它的單個範圍元件。 (start .. should_have)將返回一個範圍,each枚舉器將按照您的預期工作。

+0

謝謝。它仍然沒有創造記錄壽。 – Jay 2011-06-02 18:10:27

+1

@Jay,這是一個使用[ruby-debug](http://rubygems.org/gems/ruby-debug)的好地方。它會很快償還花在學習上的時間。你可以遍歷你的代碼,並測試變量值如你所期望的那樣。 – Mori 2011-06-02 18:14:49

+0

謝謝。我檢查出來。 – Jay 2011-06-02 18:19:26

1

我沒有看到你在哪裏使用value,不知道你爲什麼使用它。

,你可以用這個?:

if start <= should_have 
    (start .. should_have).each do |order| 
    SOrder.create(:user_id => current_user.id, :order => order, :item_id => 0) 
    end 
end 
@str_order = SOrder.where(:user_id => current_user.id).order("order") # reload 

編輯:我搬到@str_order地區以外的if語句,以確保你永遠可以重新加載陣列,如果這是不希望只是切換回來。

1

試試這個代碼加入puts "entered the loop"環路像這裏面,以確保您的代碼進入創造記錄的循環:

if start <= should_have 
    (start .. should_have).each do |v| 
    puts "entered loop" 
    SOrder.create(:user_id => current_user.id, :order => v, :item_id => 0) 
    end 

    @items = SOrder.where(:user_id => current_user.id).order("order") # reload array 
end 

如果得到印有「進入循環」,試圖.create!,以確保所有的驗證傳遞(如果其中任何一個都失敗ActiveRecord的錯誤會說明驗證籌集)

if start <= should_have 
(start .. should_have).each do |order| 
    SOrder.create!(:user_id => current_user.id, :order => order, :item_id => 0) 
end 

@str_order = SOrder.where(:user_id => current_user.id).order("order") # reload array 
end 
+0

謝謝...在這裏學到了一些東西。很有幫助。 – Jay 2011-06-02 21:05:01

+0

在這裏同意@rubyprince,'.create!'可能會對您遇到的任何故障有所瞭解。 – 2011-06-03 12:43:46

相關問題