Próbuję zapisać identyfikatory mapowania skrótu do wielu prób w mojej aplikacji rails. Moja migracja do bazy danych w celu dostosowania tej nowej kolumny:
class AddMultiWrongToUser < ActiveRecord::Migration
def self.up
add_column :users, :multi_wrong, :string
end
def self.down
remove_column :users, :multi_wrong
end
end
W swoim modelu mam:
class User < ActiveRecord::Base
serialize :multi_wrong, Hash
end
Ale kiedy używam konsoli railsów, aby to przetestować, wykonując:
user = User.create()
user.multi_wrong = {"test"=>"123"}
user.save
Wynik jest fałszywy. Co tu się dzieje?
ruby-on-rails
ruby
serialization
activerecord
cmwright
źródło
źródło
Odpowiedzi:
Typ kolumny jest nieprawidłowy. Powinieneś użyć tekstu zamiast ciągu. Dlatego Twoja migracja powinna być:
Następnie Railsy odpowiednio przekonwertują go na YAML (i przeprowadzą odpowiednią serializację). Pola ciągów mają ograniczony rozmiar i będą zawierać tylko szczególnie małe wartości.
źródło
AKTUALIZACJA:
Dokładna realizacja będzie zależała od bazy danych, ale teraz ma PostgreSQL
json
ijsonb
kolumn, które mogą natywnie przechowywania swoich danych hash / przedmiot i pozwalają na zapytania przeciwko JSON z ActiveRecord !zmień migrację i gotowe.
ORYGINALNY:
Więcej informacji: rails docs && apidock
Upewnij się, że twoja kolumna jest,
:text
a nie:string
Migracja:
$ rails g migration add_location_data_to_users location_data:text
powinien stworzyć:
Twoja klasa wyglądałaby tak:
Możliwe akcje:
Więcej niesamowitych ?!
wykorzystaj hstore postgresql
Dzięki hstore możesz ustawić atrybuty w serializowanym polu
źródło
Rails 4 ma nową funkcję o nazwie Store , dzięki czemu możesz łatwo użyć jej do rozwiązania problemu. Możesz zdefiniować dla niego akcesor i zaleca się zadeklarowanie kolumny bazy danych używanej dla serializowanego magazynu jako tekst, aby było dużo miejsca. Oryginalny przykład:
źródło