2014-01-06 22 views
0

近日筆者從Rails 3中遷移到導軌4,在這個過程之前,我注意到,分揀協會不會對Rails 4.工作以下是樣本模型:排序爲協會節能使用回調

#box.rb 

class Box < ActiveRecord::Base 
    has_many :items 

    accepts_nested_attributes_for :items, :allow_destroy => true 

    before_validate 
    items.sort! { <some condition> } 
    end 
end 

#item.rb 

class Item < ActiveRecord::Base 
    belongs_to :box 
end 

在Rails 3,sort!關聯方法修改了items散列,但在Rails 4中,它返回一個新的排序實例,但不修改實際實例。有沒有辦法解決這個問題?

+0

更重要的是,你爲什麼要這樣做? –

+0

我從保存的客戶端中獲取需要排序的項目列表。我認爲在保存之前使用參數進行保存之前,應該有一種排序關聯的方法。除此之外,我需要驗證排序的關聯。後者是可能的,而不需要修改聯繫,但前者不是。 –

+1

在保存前「排序」關聯沒有內在價值。項目保存到數據庫的順序不應該是業務邏輯的一部分,因爲它在大多數DBMS中不可靠。集合的檢索時應該處理集合的排序。 –

回答

0

試試這個:

#box.rb 

class Box < ActiveRecord::Base 
    has_many :items 

    accepts_nested_attributes_for :items, :allow_destroy => true 

    before_validate 
    self.items = items.sort { <some condition> } 
    end 
end 

#item.rb 

class Item < ActiveRecord::Base 
    belongs_to :box 
end 
+0

我已經試過了。當我嘗試使用構建方法創建包含項目的框時,排序不起作用。 –

+0

現在唯一正在使用的破解方法是使用clear方法清除關聯,然後分配回排序哈希。 –

+0

此外,這樣做會失敗所有對具有異常的update_attributes方法的調用都無法修改凍結散列。 –

0

存儲不會真正幫助之前排序。當你從數據庫中提取它們時,它們可能不是按照這個順序。您不想在許多(或在項目模型中)指定訂單。

如果您有更復雜的訂購,請發佈該邏輯。

class Box < ActiveRecord::Base 
    # Can replace position with hash like: { name: :asc } 
    has_many :item, -> { order(:position) } 

    accepts_nested_attributes_for :items, :allow_destroy => true 

    before_validate 
    items.sort! { <some condition> } 
    end 
end