Se eu criar uma nova migração do Rails 3 com (por exemplo)
rails g migration tester title:tester user:references
, tudo funciona bem ... no entanto, se eu adicionar uma coluna com algo ao longo das linhas de:
rails g migration add_user_to_tester user:references
o campo de referência não é reconhecido. Em resumo, a pergunta é: como adiciono uma coluna de referência a uma migração de trilhos a partir da linha de comando?
ruby-on-rails
activerecord
migration
Plâncton
fonte
fonte
EDIT : Esta é uma resposta desatualizada e não deve ser aplicada ao Rails 4.x +
Você não precisa adicionar referências quando pode usar um ID inteiro para sua classe referenciada.
Eu diria que a vantagem de usar referências em vez de um número inteiro simples é que o modelo será predefinido com perten_to e, como o modelo já foi criado e não será afetado quando você migrar algo existente, o objetivo é meio que perdido.
Então, eu faria assim:
E, em seguida, adicione manualmente o usuário belongs_to: no modelo do Testador
fonte
Observe que você provavelmente também precisará de um índice nessa coluna.
fonte
user.testers
aprovado, poderá omitir o índice.rails g migration ...
geradoadd_reference :installs, :device, index: true
que também cria o índice.Com as duas etapas anteriores mencionadas acima, você ainda está perdendo a restrição de chave estrangeira. Isso deve funcionar:
fonte
Você pode usar referências em uma migração de alterações. Este é um código válido do Rails 3.2.13:
cf: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
fonte
down
método, recebiActiveRecord::IrreversibleMigration
ao reverter usando o Rails 3.2. Eu também tive que mudarchange
paraup
.A execução
rails g migration AddUserRefToSponsors user:references
gerará a seguinte migração:fonte
Ao adicionar uma coluna, você precisa torná-la um número inteiro e, se possível, manter as convenções de trilhos. Portanto, no seu caso, suponho que você já tenha modelos de Testador e Usuário e tabelas de testadores e usuários.
Para adicionar a chave estrangeira, você precisa criar uma coluna inteira com o nome user_id (convenção):
Em seguida, inclua um belongs_to no modelo do testador:
E você também pode querer adicionar um índice para a chave estrangeira (isso é algo que as referências já fazem para você):
fonte
Isso será o suficiente:
fonte
Você pode adicionar referências ao seu modelo através da linha de comando da seguinte maneira:
Isso irá gerar um arquivo de migração como:
Isso funciona bem toda vez que eu usá-lo ..
fonte
Para Rails 4
O gerador aceita o tipo de coluna como referência (também disponível como
belongs_to
).Essa migração criará uma
user_id
coluna e um índice apropriado:gera:
http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration
Para Rails 3
O auxiliar é chamado de referências (também disponível como
belongs_to
).Essa migração criará uma
category_id
coluna do tipo apropriado. Observe que você passa o nome do modelo, não o nome da coluna. Active Record adiciona o_id
para você.Se você tiver
belongs_to
associações polimórficas , as referências incluirão as duas colunas necessárias:Adicionará uma coluna attachment_id e uma
attachment_type
coluna de string com um valor padrão dePhoto
.http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration
fonte