我正在處理一個問題,我需要在數據庫中存儲序列化的Ruby對象的層次結構。許多需要保存的對象都是具有很多屬性的ActiveRecord對象。我不加載整個對象,然後在加載它們的時候從數據庫中刷新它們的屬性(如果它們發生了變化,很可能會發生變化),只需要存儲這些對象的引用(類和數據庫ID)會更容易。序列化ActiveRecord對象而不存儲它們的屬性?
有誰知道在Rails中是否有辦法做到這一點,或者如果有現成的寶石?希望在花費大量時間對它進行檢查之前檢查是否存在某種東西。
我正在處理一個問題,我需要在數據庫中存儲序列化的Ruby對象的層次結構。許多需要保存的對象都是具有很多屬性的ActiveRecord對象。我不加載整個對象,然後在加載它們的時候從數據庫中刷新它們的屬性(如果它們發生了變化,很可能會發生變化),只需要存儲這些對象的引用(類和數據庫ID)會更容易。序列化ActiveRecord對象而不存儲它們的屬性?
有誰知道在Rails中是否有辦法做到這一點,或者如果有現成的寶石?希望在花費大量時間對它進行檢查之前檢查是否存在某種東西。
據我瞭解您的問題,您應谷歌:acts_as_nested_set
better_nested_set
even_better_nested_set
和awesome_nested_set
。我知道它們不存儲序列化的層次結構,但是應該以原子方式存儲它們的結點。即使是巨大的交通網站也是如此除此之外 - 你應該考慮NoSQL(或無模式數據庫)。
這是行得通的,現在我正在做的,但它存儲了對象的所有屬性。然後在反序列化之後,無論如何我必須重新加載ActiveRecord對象,因爲它們可能在數據庫中發生了變化,因此浪費了大量的空間,將編組屬性丟棄(由更多當前屬性取代)。我想破解:serialize/Marshal,因此它會存儲activerecord對象的id並從數據庫重新加載它們。 – 2010-03-26 08:36:00
你需要在你的ruby類上實現marshal_load和marshal_dump方法。您可以選擇要序列化的屬性和要加載的屬性。有關更多詳情,請參閱「potapuff」鏈接的答案。 (+1) – 2010-03-26 09:31:50
我認爲serialize使用YAML而不是Marshal。如果要精確控制序列化的內容,請引入一個不擴展AR :: Base的類,並實現to_yaml_properties。然後將這個類的實例序列化到一個AR對象上。 – Levi 2010-03-26 12:49:31