我从外部库中获取了一些对象,我需要将这些对象存储在数据库中。有没有办法从对象开始创建表和关系,或者我必须深入研究它们并手动创建迁移和模型?

谢谢! 罗伯特

有帮助吗?

解决方案

即使你可以动态地动态创建表格(不是说你可以)。我不想那样做。那里有很多错误的可能性。

我会手动创建迁移并预先创建表格和字段,并根据需要用行填充它们。

其他提示

注意:这是一个可怕的黑客,你将在未来几年内解决这些问题,但它很容易:

这依赖于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的所有概念,所以你需要设计一些持久化的机制。

我有这种确切的情况。我必须读取应用程序外部的数据,并且性能影响如此之大,以至于我在本地存储。我已经找到了一个解决方案,随着时间的推移,我手动开发了一个模式和迁移,它可以处理数据,并允许我将数据保存到表中。我开发了一个适用于我的数据的缓存方案,性能显着提高。

所有这一切,我手工做了一切,我不后悔。我可以确信我的数据库是稳定的,并且我不会动态地重新创建数据库表。因此,我不关心我的申请的稳定性。

根据您要对对象执行的操作,您可以通过序列化

尝试查看一些ORM解决方案。或者以XML格式存储。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top