2013-06-05 80 views
0

我有一個Rails應用程序的表單,允許更新singular_collection_ids屬性(關係類型爲has_many到)。我還需要在更新之前驗證它。rails singular_collection_ids驗證

驗證問題需要以前的對象值,但沒有方法singular_collection_ids_was提供此值。此外singular_collection_ids方法直接與連接表沒有臨時值,所以

self.class.find(id).singular_collection_ids 

內驗證沒有幫助。

有沒有什麼辦法在驗證階段獲得以前的價值?

+0

你想用這個做什麼?也許還有另外一種方式比使用'singular_collection_ids'。 –

+0

以我爲例 - 我有兩個模型:**玩家**和**成就**他們通過模型** JoinModel **互相鏈接。所以在這兩種球員和成就的編輯形式中,我都有鏈接模型的複選框 - 所以我可以將球員排成一團或一組成績給玩家。所以它看起來像:'Player.find(blabla).achievement_ids = [2,3,4]'。通過應用邏輯,我應該檢查此字段的以前的數據(achievement_ids或player_ids) – exdee

+0

我現在解決我的問題的唯一方法是覆蓋** singular_collection_ids = **方法並添加實例變量以存儲以前的值。 – exdee

回答

0

不知道它的工作原理(這絕對是古怪的),但你可以試試這個:

class Player 

    has_many :join_models, before_remove: :prevent_achievement_removal 

    def prevent_achievement_removal(join_model) 
    errors.add(:base, "Cannot remove an achievement this way !") 
    raise ::ActiveRecord::RecordInvalid 
    end 

end 

根據the doc,如果回調引發任何錯誤,記錄不會被刪除。然而,事情並沒有真正感覺到這一點......我會試着想一個更好的解決方案。

+0

在我的案例類的樣子: '類播放器<<的ActiveRecord :: Base的 的has_many:join_models 的has_many:成就,通過:join_models,before_remove:布拉布拉 高清布拉布拉 #... end' 但只有添加錯誤:base和返回false將不會執行任何操作,並且引發異常會停止該程序。所以在刪除之前還有一個額外的事件觸發器,以及如何使用它像驗證過程我不知道 – exdee

+0

** before_remove **事件工作方式不同於模型的** before_update **等(它允許添加錯誤if必要並使更新操作無效)。 – exdee

+0

關聯塊中的導軌指南中還有下一個文本:_您應該使用has_many:through,如果您需要驗證,回調或連接模型上的額外屬性_但我沒有明白這句話的含義。 – exdee