2013-04-24 33 views
2

我有列表模型有很多項目。這些項目有一個priority,在列表範圍內是唯一的。重新排序ActiveRecord Association中的唯一有序模型

class List < ActiveRecord::Base 
    has_many :items 
    accepts_nested_attributes_for :items 
end 

class Item < ActiveRecord::Base 
    validates :priority, uniqueness: { :scope => :list_id } 
end 

所以,如果我從API調用返回一個給定的列表,它看起來像這樣:

{ 
    items: [ 
    { "id": 1, "priority": 1 }, 
    { "id": 2, "priority": 2 }, 
    { "id": 3, "priority": 3 } 
    ] 
} 

用戶重新排列在前端的項目,它使一個PUT請求到服務器

{ 
    items_attributes: [ 
    { "id": 1, "priority": 3 }, 
    { "id": 2, "priority": 1 }, 
    { "id": 3, "priority": 2 } 
    ] 
} 

但這會失敗。當這些嘗試中的一個保存時,它將檢查是否存在具有相同列表ID和優先級的另一項目。由於其他項目尚未在數據庫中更新,因此此驗證將失敗。

我該如何實現此更新?

回答

0

允許list_id列中的nils,以便您可以重置值。

validates :priority, uniqueness: { :scope => :list_id }, unless: Proc.new { |l| l.list_id.blank? } 

在你的控制器,重置列:

ItemController.update_all("priority = null"); 

然後將它們設置爲你現在使用的傳遞PARAMS。只要確保在保存之前測試模型的有效性(valid?)。