2010-03-26 63 views
0

我正在處理一個問題,我需要在數據庫中存儲序列化的Ruby對象的層次結構。許多需要保存的對象都是具有很多屬性的ActiveRecord對象。我不加載整個對象,然後在加載它們的時候從數據庫中刷新它們的屬性(如果它們發生了變化,很可能會發生變化),只需要存儲這些對象的引用(類和數據庫ID)會更容易。序列化ActiveRecord對象而不存儲它們的屬性?

有誰知道在Rails中是否有辦法做到這一點,或者如果有現成的寶石?希望在花費大量時間對它進行檢查之前檢查是否存在某種東西。

回答

2

據我瞭解您的問題,您應谷歌:acts_as_nested_setbetter_nested_seteven_better_nested_setawesome_nested_set。我知道它們不存儲序列化的層次結構,但是應該以原子方式存儲它們的結點。即使是巨大的交通網站也是如此除此之外 - 你應該考慮NoSQL(或無模式數據庫)。

1

據我瞭解你的問題,你應該添加到你的模型:serialize field_name並推動所有屬性嵌套對象到這個領域。 Rails將使用寶石元帥將這個對象序列化。

有一些使用沒有rails和ActiveRecord的Marshal序列化的例子。 和this - Stack Overflow的答案,它是如何工作的。

+0

這是行得通的,現在我正在做的,但它存儲了對象的所有屬性。然後在反序列化之後,無論如何我必須重新加載ActiveRecord對象,因爲它們可能在數據庫中發生了變化,因此浪費了大量的空間,將編組屬性丟棄(由更多當前屬性取代)。我想破解:serialize/Marshal,因此它會存儲activerecord對象的id並從數據庫重新加載它們。 – 2010-03-26 08:36:00

+1

你需要在你的ruby類上實現marshal_load和marshal_dump方法。您可以選擇要序列化的屬性和要加載的屬性。有關更多詳情,請參閱「potapuff」鏈接的答案。 (+1) – 2010-03-26 09:31:50

+0

我認爲serialize使用YAML而不是Marshal。如果要精確控制序列化的內容,請引入一個不擴展AR :: Base的類,並實現to_yaml_properties。然後將這個類的實例序列化到一個AR對象上。 – Levi 2010-03-26 12:49:31

相關問題