como gerar migração para fazer referências polimórficas

121

Eu tenho uma tabela de produtos e quero adicionar uma coluna:

t.references :imageable, :polymorphic => true

Eu estava tentando gerar migração para isso fazendo:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

mas obviamente estou fazendo errado. Alguém pode fazer alguma sugestão? obrigado

Quando tento inseri-lo manualmente após gerar a migração, fiz o seguinte:

class AddImageableToProducts < ActiveRecord::Migration
  def self.up
    add_column :products, :imageable, :references, :polymorphic => true
  end

  def self.down
    remove_column :products, :imageable
  end
end

e ainda não funcionou

railslearner
fonte
Não é uma resposta, mas para evitar confusão, você tem certeza de que deseja esta coluna em Produtos? O guia de trilhos ainda tem um exemplo de produtos e a coluna está em Pictures Guides.rubyonrails.org/…
atomkirk

Respostas:

109

Até onde eu sei, não há gerador embutido para associações polimórficas. Gere uma migração em branco e modifique-a manualmente, de acordo com suas necessidades.

Atualização : você precisará especificar qual tabela está alterando. De acordo com esta resposta SO :

class AddImageableToProducts < ActiveRecord::Migration
  def up
    change_table :products do |t|
      t.references :imageable, polymorphic: true
    end
  end

  def down
    change_table :products do |t|
      t.remove_references :imageable, polymorphic: true
    end
  end
end
Michelle Tilley
fonte
Muito obrigado Brandon. Consegui executar a migração. Fiquei pensando, porém, depois que você cria: polymorphic => true e você abre schema.rb, você também deve vê-lo no esquema?
Railslearner #
Depois de executar a migração, ela schema.rbdeve ser atualizada, mas não diz nada sobre polymorphic. Em vez disso, você deve ver os campos reais que o Rails usa (os Guias do Rails têm mais informações).
31411 Michelle Rodriguez
2
Como você adiciona índice à referencescoluna? Preciso indexar isso?
mrudult
@mududult Se não me engano, você precisa adicioná-los, se precisar. Você pode apenas adicionar índices normalmente no arquivo de migração para imageable_typee / ou imageable_idconforme necessário.
precisa
2
Sim. adicionando índice imageable_ide imageable_typefuncionou. Obrigado pela ajuda.
mrudult
266

O que você está tentando fazer ainda não está implementado na versão estável dos trilhos, portanto a resposta de Michelle é a certa por enquanto. Mas esse recurso será implementado nos trilhos 4 e já está disponível na versão edge da seguinte forma (de acordo com este CHANGELOG ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}
simon-olivier
fonte
1
Tentei isso no 4.2, e não tenho certeza se isso é um bug, zsh ou outra coisa, mas a linha de comando foi interpretada como uma série de referências (como tipos) com cada letra polimórfica, como: t.referencesp: imagable , treferenceso: imagable, etc
OzBarry
10
@OzBarry, em zsh você precisa escapar as chaves: $ rails gerar migração AddImageableToProducts representável: referências \ {polimórfica \}
chad_
4
Para qualquer um curioso, isso gera uma migração com o método de mudança contendo:add_reference :products, :imageable, polymorphic: true, index: true
stevenspiel
1
Caso alguém tente usar o mesmo no andaime, isso também funciona com o andaime. Obrigado! rijks
sghosh968 6/06
2
{polymorphic}precisa ser escapado com a casca do peixe, por exemplo\{polymorphic\}
Dorian
36

Você também pode fazer o seguinte:

class AddImageableToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :imageable, polymorphic: true, index: true
  end
end
freddyrangel
fonte
16

Podes tentar rails generate migration AddImageableToProducts imageable:references{polymorphic}

hutusi
fonte
3
{e }necessidade de ser escapado com a shell peixe pelo menos, por exemplo\{polymorphic\}
Dorian
1
Aqui está o link para a documentação sobre isso: edgeguides.rubyonrails.org/…
Giovanni Benussi
Obrigado Giovanni, isso é muito útil.
Htusi