2012-02-13 78 views
0

在我的代碼中,我有一個類別模型,它有許多子類別,而子類別屬於一個類別。如何衝突更新現有記錄,Ruby on Rails

子類別有一個位置字段來跟蹤它應該排列在類別下的位置。這是我的SubCategory的Model代碼。

class Subcategory < ActiveRecord::Base 
    belongs_to :category 
    has_many :products 
    validates_uniqueness_of :position 
    scope :position, order("position asc") 
end 

正如你所看到的,它不允許重複的位置。當它檢測到子類別的位置已經存在時,我希望它提示用戶說出類似於「該位置已被佔用,但仍然可以插入,您要繼續嗎?」是|如果是,那麼我需要它爲所有當前類別子類別添加+1:位置(在'有問題的子類別'位置之後。因此,如果類別1在有人嘗試時具有子類別1,2和3添加一個新的子類別與位置2,我需要將當前2和3下降到3和4插入新的子類別定位2.

如果沒有,那麼我只是希望它返回到編輯屏幕。

我不知道如何編寫這正是,我假設在檢查:位置衝突將在子類控制器,如果保存失敗

所以我的兩個問題是:哪裏是最好的地方來檢查這個代碼,我需要編寫代碼的幫助/想法。

回答

0

設置獨特的驗證之外,這將重新索引的位置:

# build a new subcategory 
subcategory = category.subcategories.build(:foo => :bar) 

# some arbitrary, zero-based position desired by your user 
position = 3 

# insert the subcategory at the desired position 
category.subcategories.insert(position, subcategory) 

# use each with index to re-index all of your subcategories 
category.subcategories.each_with_index do |sc, index| 
    sc.position = index 
end 

而是驗證獨特性,你可以添加一個before_validation回調的類別,只是確保你有一個排序,組連續位置的在子類別中。

+0

我沒有解釋最後一點。忘記回調。類別可以具有自定義驗證,以確保如果它具有子類別,那些子類別具有連續的位置值集合。 – 2012-02-15 16:18:44

1

我建議acts_as_list來管理這個職位。處理你所談論的一切,除了你需要手動檢查碰撞以便提示用戶:

if Subcategory.exists?(:position => params[:position]) # or whatever 
    # alert the user 
end