Você deve usar text
com Rails se quiser uma string sem limite de comprimento. Uma migração como esta:
def up
change_column :your_table, :your_column, :text
end
def down
# This might cause trouble if you have strings longer
# than 255 characters.
change_column :your_table, :your_column, :string
end
deve resolver as coisas. Você pode querer :null => false
ou algumas outras opções no final disso também.
Quando você usa uma string
coluna sem um limite explícito, o Rails adicionará um implícito :limit => 255
. Mas se você usar text
, obterá qualquer tipo de string de comprimento arbitrário que o banco de dados suporta. PostgreSQL permite que você use uma varchar
coluna sem comprimento, mas a maioria dos bancos de dados usa um tipo separado para isso e o Rails não conhece varchar
sem comprimento. Você tem que usar text
no Rails para obter uma text
coluna no PostgreSQL. Não há diferença no PostgreSQL entre uma coluna do tipo text
e outra do tipo varchar
(mas varchar(n)
é diferente). Além disso, se você estiver implantando em cima do PostgreSQL, não há razão para usar :string
(AKA varchar
), o banco de dados trata text
evarchar(n)
o mesmo internamente, exceto para as restrições de comprimento extra para varchar(n)
; você só deve usar varchar(n)
(AKA :string
) se tiver uma restrição externa (como um formulário do governo que diz que o campo 432 no formulário 897 / B terá 23 caracteres) no tamanho da coluna.
Como um aparte, se você estiver usando uma string
coluna em qualquer lugar, você deve sempre especificar o :limit
como um lembrete para si mesmo de que há um limite e você deve ter uma validação no modelo para garantir que o limite não seja excedido. Se você exceder o limite, o PostgreSQL reclamará e levantará uma exceção, o MySQL silenciosamente truncará a string ou reclamará (dependendo da configuração do servidor), o SQLite deixará passar como está e outros bancos de dados farão outra coisa (provavelmente reclamarão) .
Além disso, você também deve desenvolver, testar e implantar no mesmo banco de dados (que normalmente será PostgreSQL no Heroku), você deve até usar as mesmas versões do servidor de banco de dados. Existem outras diferenças entre os bancos de dados (como o comportamento de GROUP BY) das quais ActiveRecord não o isolará. Você pode já estar fazendo isso, mas pensei em mencioná-lo de qualquer maneira.
change
não seja capaz de reverter automaticamente uma mudança de tipo e o Guia de Migrações diz que "[o método de mudança] Este método é preferido para escrever migrações construtivas (adicionando colunas ou tabelas)" echange_column
isn ' t na lista que você aponta, então acho que você está certo. Consertei para usarup
/down
(com uma ressalva sobre odown
), obrigado pelo .text
apenas para obter comprimento ilimitado; você pode apenas usar sem restriçõesvarchar
. O Rails está impondo esse limite ímpar, não o PostgreSQL.Embora a resposta aceita seja excelente, eu queria adicionar uma resposta aqui que, com sorte, lide melhor com a pergunta dos pôsteres originais, parte 2, para não especialistas como eu.
gerando migração de andaime
Você pode gerar uma migração para manter sua alteração digitando em seu console (basta substituir o
table
pelo nome das suas tabelas ecolumn
pelo nome da coluna)Isso irá gerar um esqueleto de migração dentro de sua aplicação Rails / db / migrate / pasta. Esta migração é um espaço reservado para seu código de migração.
Por exemplo, eu quero criar uma migração para alterar o tipo de uma coluna de
string
paratext
, em uma tabela chamada TodoItems:Executando sua migração
Depois de inserir o código para alterar a coluna, execute:
Para aplicar sua migração. Se você cometer um erro, pode sempre reverter a alteração com:
Métodos para cima e para baixo
As referências
Up
eDown
métodos de resposta aceitos , em vez doChange
método mais recente . Desde o estilo antigo do rails 3.2 , os métodos Up e Down apresentaram algumas vantagens sobre o método Change mais recente. Evite 'para cima e para baixo'ActiveRecord::IrreversibleMigration exception
. Desde o lançamento do Rails 4 você pode usarreversible
para evitar este erro:Aproveite o Rails :)
fonte