Estou tentando salvar um ID de mapeamento de hash em várias tentativas no meu aplicativo de trilhos. Minha migração para o banco de dados para acomodar esta nova coluna:
class AddMultiWrongToUser < ActiveRecord::Migration
def self.up
add_column :users, :multi_wrong, :string
end
def self.down
remove_column :users, :multi_wrong
end
end
No meu modelo eu tenho:
class User < ActiveRecord::Base
serialize :multi_wrong, Hash
end
Mas quando eu uso o console do Rails para testar isso, faça:
user = User.create()
user.multi_wrong = {"test"=>"123"}
user.save
A saída é falsa. O que está acontecendo de errado aqui?
ruby-on-rails
ruby
serialization
activerecord
cmwright
fonte
fonte
Respostas:
O tipo de coluna está incorreto. Você deve usar Texto em vez de String. Portanto, sua migração deve ser:
Em seguida, o Rails o converterá corretamente em YAML para você (e executará a serialização adequada). Os campos de strings são limitados em tamanho e conterão apenas valores especialmente pequenos.
fonte
ATUALIZADA:
Implementação exata vai depender do seu banco de dados, mas o PostgreSQL tem agora
json
ejsonb
colunas que pode nativamente armazenar seus dados de hash / objeto e permitir que você consulta contra o JSON com ActiveRecord !altere sua migração e pronto.
ORIGINAL:
Para mais detalhes: rails docs && apidock
Verifique se a sua coluna está
:text
e não:string
Migração:
$ rails g migration add_location_data_to_users location_data:text
deve criar:
Sua classe seria semelhante a:
Ações disponíveis:
Mais impressionante ?!
utilize o postgresql hstore
Com o hstore, você pode definir atributos no campo serializado
fonte
O Rails 4 possui um novo recurso chamado Store , para que você possa usá-lo facilmente para resolver seu problema. Você pode definir um acessador para ele e é recomendável declarar a coluna do banco de dados usada para o armazenamento serializado como um texto, para que haja bastante espaço. O exemplo original:
fonte