Pergunta

Estou recebendo alguns objetos de uma biblioteca externa e eu preciso para armazenar esses objetos em um banco de dados. Existe uma maneira para criar as tabelas e relacionamentos a partir dos objetos, ou eu tenho que cavar-los e criar migrações e modelos à mão?

Obrigado! Roberto

Foi útil?

Solução

Mesmo se você pudesse criar dinamicamente tabelas na mosca assim (não dizendo que você pode). Eu não gostaria de fazer isso. Há tanto potencial de erro lá.

Gostaria de criar as migrações de mão e ter as tabelas e campos do pré-criados e preenchê-los com linhas conforme necessário.

Outras dicas

Nota: Este é um hack terrível e você poderá passar a ferro para fora os erros para os próximos anos, mas é no entanto muito fácil:

Esta baseia-se em trilhos ActiveSupport, e ActiveRecord já sendo carregado

dizer que você começa um objeto aleatório de uma biblioteca de terceiros que tem 2 variáveis ??de instância - sua classe pode ter esta aparência:

class Animal
    attr_accessor :name, :number_of_legs
end
a = SomeThirdPartyLibrary.get_animal

Você pode usar o reflexo para descobrir que seu nome, e colunas:

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

Em seguida, você pode usar as migrações ActiveRecord para criar sua mesa, como este:

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

Em seguida, você pode finalmente declarar uma classe activerecord que irá interagir com a tabela recém-criada.

# 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!

Agora você pode fazer isso:

a = GeneratedClasses::Animal.new
a.update_attributes whatever
a.save

PS: Não faça isso

Além de ser horrível, se os seus trilhos app reinicia ele vai perder todo conceito de classes geradas, então você precisa criar algum mecanismo de persistir os demais.

Eu tenho esta situação exata. Eu tenho que ler dados externos para a aplicação e o impacto no desempenho é tão grande, que eu armazenar localmente. Eu tenho ido com uma solução onde eu, ao longo do tempo, desenvolveu um esquema e migrações à mão, que o trabalho com os dados, e permitam-me a persistir os dados para as tabelas. Eu desenvolvi um esquema de cache que funciona para os meus dados e o desempenho tem aumentado significativamente.

Tudo isso para dizer, eu fiz tudo à mão e eu não me arrependo. Eu posso ter confiança de que meu banco de dados é estável e que não estou re-criação de tabelas db na mosca. Por causa disso, eu não tenho nenhuma preocupação com a estabilidade da minha candidatura.

Dependendo do que você está tentando fazer com os objetos, você pode armazenar objetos diretamente no banco de dados serialização -los.

Tente olhar para algumas soluções ORM. Ou loja como XML.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top