我从外部库中获取一些对象,我需要将这些对象存储在数据库中。有没有办法从对象开始创建表和关系,或者我必须深入研究它们并手动创建迁移和模型?
谢谢!罗伯托
我从外部库中获取一些对象,我需要将这些对象存储在数据库中。有没有办法从对象开始创建表和关系,或者我必须深入研究它们并手动创建迁移和模型?
谢谢!罗伯托
即使您可以像那样动态地创建表(不是说可以)。我不想那样做。那里有很大的错误可能性。
我会手动创建迁移并预先创建表和字段,并根据需要用行填充它们。
注意:这是一个可怕的 hack,您将在未来几年内消除这些错误,但它非常容易:
这依赖于 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"
快!
现在你可以这样做:
a = GeneratedClasses::Animal.new
a.update_attributes whatever
a.save
PS:不要这样做!
除了很糟糕之外,如果您的 rails 应用程序重新启动,它将失去生成类的所有概念,因此您还需要设计一些持久化这些类的机制。
我有这个确切的情况。我必须读取应用程序外部的数据,并且性能影响如此之大,以至于我存储在本地。我已经采用了一种解决方案,随着时间的推移,我已经手动开发了一个模式和迁移,它可以处理数据,并允许我将数据保存到表中。我开发了一种适用于我的数据的缓存方案,并且性能显着提高。
话虽如此,我都是手工完成的,我不后悔。我可以确信我的数据库是稳定的,并且我不会即时重新创建数据库表。因此,我不担心我的应用程序的稳定性。
根据您尝试对对象执行的操作,您可以通过序列化对象将对象直接存储到数据库中。
尝试查看一些 ORM 解决方案。或存储为 XML。