我从外部库中获取了一些对象,我需要将这些对象存储在数据库中。有没有办法从对象开始创建表和关系,或者我必须深入研究它们并手动创建迁移和模型?
谢谢! 罗伯特
答案 0 :(得分:2)
即使你可以动态地动态创建表格(不是说你可以)。我不想那样做。那里有很多错误的可能性。
我会手动创建迁移并预先创建表格和字段,并根据需要用行填充它们。
答案 1 :(得分:2)
注意:这是一个可怕的黑客,你将在未来几年内解决这些问题,但它很容易:
这依赖于rails 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应用程序重启,它将失去Generated Classes的所有概念,所以你需要设计一些持久化的机制。
答案 2 :(得分:1)
我有这种确切的情况。我必须读取应用程序外部的数据,并且性能影响如此之大,以至于我在本地存储。我已经找到了一个解决方案,随着时间的推移,我手动开发了一个模式和迁移,它可以处理数据,并允许我将数据保存到表中。我开发了一个适用于我的数据的缓存方案,性能显着提高。
所有这一切,我手工做了一切,我不后悔。我可以确信我的数据库是稳定的,并且我不会动态地重新创建数据库表。因此,我不关心我的申请的稳定性。
答案 3 :(得分:1)
根据您尝试对象的操作,您可以通过serializing将对象直接存储到数据库中。
答案 4 :(得分:0)
尝试查看一些ORM解决方案。或者以XML格式存储。