2

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

谢谢!罗伯托

4

5 回答 5

2

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

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

于 2008-09-30T16:32:04.117 回答
2

注意:这是一个可怕的 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 应用程序重新启动,它将失去生成类的所有概念,因此您还需要设计一些持久化这些类的机制。

于 2008-10-01T00:53:23.383 回答
1

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

话虽如此,我都是手工完成的,我不后悔。我可以确信我的数据库是稳定的,并且我不会即时重新创建数据库表。因此,我不担心我的应用程序的稳定性。

于 2008-09-30T17:30:05.430 回答
1

根据您尝试对对象执行的操作,您可以通过序列化对象将对象直接存储到数据库中。

于 2008-09-30T20:17:57.867 回答
0

尝试查看一些 ORM 解决方案。或存储为 XML。

于 2008-09-30T16:18:50.827 回答