Примечание: это УЖАСНЫЙ взлом, и вы будете исправлять ошибки на долгие годы, но это довольно легко:
Это полагается на рельсы 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 перезапустится, оно потеряет всю концепцию сгенерированных классов, поэтому вам нужно будет разработать какой-то механизм их сохранения.