Переход от объектов к таблицам с помощью activerecord

StackOverflow https://stackoverflow.com/questions/153795

Вопрос

Я получаю некоторые объекты из внешней библиотеки, и мне нужно сохранить эти объекты в базе данных.Есть ли способ создать таблицы и связи, начиная с объектов, или мне придется копаться в них и создавать миграции и модели вручную?

Спасибо!Роберто

Это было полезно?

Решение

Даже если бы вы могли динамически создавать таблицы "на лету" подобным образом (не говорю, что вы можете).Я бы не хотел этого делать.Там так много возможностей для ошибок.

Я бы создал миграции вручную, предварительно создав таблицы и поля и заполнив их строками по мере необходимости.

Другие советы

Примечание:Это УЖАСНЫЙ взлом, и вы будете исправлять ошибки долгие годы, но, тем не менее, это довольно просто:

Это зависит от 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 migrations для создания своей таблицы, например:

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 перезапустится, оно потеряет всю концепцию сгенерированных классов, поэтому вам также нужно будет разработать какой-то механизм их сохранения.

У меня именно такая ситуация.Мне приходится считывать данные, внешние по отношению к приложению, а снижение производительности настолько велико, что я сохраняю их локально.Я выбрал решение, в котором со временем вручную разработал схему и миграции, которые работают с данными и позволяют мне сохранять данные в таблицах.Я разработал схему кэширования, которая работает для моих данных, и производительность значительно возросла.

Тем не менее, я все делал вручную и не жалею об этом.Я могу быть уверен, что моя база данных стабильна и что я не создаю заново таблицы БД "на лету".Из-за этого я не беспокоюсь о стабильности своего приложения.

В зависимости от того, что вы пытаетесь сделать с объектами, вы можете сохранять объекты непосредственно в базе данных с помощью сериализация они.

Попробуйте взглянуть на некоторые решения ORM.Или сохранить в виде XML.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top