我從外部庫中獲取一些對象,並且需要將這些對象存儲在數據庫中。有沒有辦法從對象開始創建表和關係,或者我需要深入研究它們並手動創建遷移和模型?從對象到使用activerecord的表格
謝謝! Roberto
我從外部庫中獲取一些對象,並且需要將這些對象存儲在數據庫中。有沒有辦法從對象開始創建表和關係,或者我需要深入研究它們並手動創建遷移和模型?從對象到使用activerecord的表格
謝謝! Roberto
即使您可以像這樣動態地創建表格(不是說可以)。我不想這樣做。那裏有很多錯誤。
我會手工創建遷移並預先創建表格和字段,並根據需要用行填充它們。
嘗試查看一些ORM解決方案。或者以XML格式存儲。
我有這種確切的情況。我必須讀取應用程序外部的數據,並且性能影響非常大,我本地存儲。我隨身帶着一個解決方案,隨着時間的推移,我開發了一個模式和手動遷移,處理數據,並允許我將數據保存到表中。我開發了一種適用於我的數據的緩存方案,性能顯着提高。
所有這一切都說,我做了所有的事情,我不後悔。我可以放心,我的數據庫是穩定的,並且我不是在飛行中重新創建數據庫表。因此,我不擔心我的應用程序的穩定性。
根據你想要用對象做什麼,你可以通過serializing將對象直接存儲到數據庫中。
注:這是一個可怕的黑客,你會被燙出的錯誤幾年來,但它不過很簡單:
這依賴於軌道的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應用程序重新啓動,它將失去生成類的所有概念,因此您需要設計一些持久化的機制。
請問您能否澄清一下:您是否從外部庫中獲取需要在本地存儲的對象實例,或者您只是從庫中獲取對象結構,並且需要存儲自己的這些對象實例? – 2008-09-30 18:15:45