2008-09-30 34 views
2

我從外部庫中獲取一些對象,並且需要將這些對象存儲在數據庫中。有沒有辦法從對象開始創建表和關係,或者我需要深入研究它們並手動創建遷移和模型?從對象到使用activerecord的表格

謝謝! Roberto

+0

請問您能否澄清一下:您是否從外部庫中獲取需要在本地存儲的對象實例,或者您只是從庫中獲取對象結構,並且需要存儲自己的這些對象實例? – 2008-09-30 18:15:45

回答

2

即使您可以像這樣動態地創建表格(不是說可以)。我不想這樣做。那裏有很多錯誤。

我會手工創建遷移並預先創建表格和字段,並根據需要用行填充它們。

0

嘗試查看一些ORM解決方案。或者以XML格式存儲。

1

我有這種確切的情況。我必須讀取應用程序外部的數據,並且性能影響非常大,我本地存儲。我隨身帶着一個解決方案,隨着時間的推移,我開發了一個模式和手動遷移,處理數據,並允許我將數據保存到表中。我開發了一種適用於我的數據的緩存方案,性能顯着提高。

所有這一切都說,我做了所有的事情,我不後悔。我可以放心,我的數據庫是穩定的,並且我不是在飛行中重新創建數據庫表。因此,我不擔心我的應用程序的穩定性。

1

根據你想要用對象做什麼,你可以通過serializing將對象直接存儲到數據庫中。

2

注:這是一個可怕的黑客,你會被燙出的錯誤幾年來,但它不過很簡單:

這依賴於軌道的ActiveSupport,ActiveRecord的和已經被加載

說你從具有2個實例變量第三方庫隨機對象 - 它的類可能是這樣的:

class Animal 
    attr_accessor :name, :number_of_legs 
end 
a = SomeThirdPartyLibrary.get_animal 

您可以使用反射來找出它的名字,和列:

table_name = a.class.to_s.tableize 
column_names = a.instance_variables.map{ |n| n[1..-1] } # remove the @ 
column_types = a.instance_variables.map{ |n| a.instance_variable_get(n).class 
    }.map{ |c| sql_type_for_class(c) } # go write sql_type_for_class please 

然後你就可以使用ActiveRecord遷移創建表,如下所示:

ActiveRecord::Migration.class_eval do 
    create_table table_name do |t| 
    column_names.zip(column_types).each do |colname, coltype| 
     t.column colname, coltype 
    end 
    end 
end 

然後你終於可以宣告一個ActiveRecord類,那麼這將與剛剛創建的表接口。

# Note we declare a module so the new classes don't conflict with the existing ones 
module GeneratedClasses; end 
eval "class GeneratedClasses::#{a.class} < ActiveRecord::Base; end" 

Presto!

現在你可以這樣做:

a = GeneratedClasses::Animal.new 
a.update_attributes whatever 
a.save 

PS:別這樣!

除了糟糕之外,如果您的rails應用程序重新啓動,它將失去生成類的所有概念,因此您需要設計一些持久化的機制。

相關問題