От объектов к таблицам с использованием activerecord - PullRequest
2 голосов
/ 30 сентября 2008

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

Спасибо! Roberto

Ответы [ 5 ]

2 голосов
/ 01 октября 2008

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

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

2 голосов
/ 30 сентября 2008

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

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

1 голос
/ 01 октября 2008

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

1 голос
/ 30 сентября 2008

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

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

0 голосов
/ 30 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...