Использование Rails serialize для сохранения хэша в базе данных



Я пытаюсь сохранить хэш-сопоставление идентификаторов для нескольких попыток в моем приложении rails. Моя миграция в базу данных для размещения этого нового столбца:



class AddMultiWrongToUser < ActiveRecord::Migration
def self.up
add_column :users, :multi_wrong, :string
end

def self.down
remove_column :users, :multi_wrong
end
end


В моей модели у меня есть:



class User < ActiveRecord::Base 
serialize :multi_wrong, Hash
end


но когда я использую консоль rails, чтобы проверить это, выполнив:



user = User.create()
user.multi_wrong = {"test"=>"123"}
user.save


вывод ложен. Что здесь происходит?

717   3  

3 ответов:

неверный тип столбца. Вы должны использовать текст вместо строки. Поэтому ваша миграция должна быть:

 def self.up
   add_column :users, :multi_wrong, :text
 end

тогда Rails правильно преобразует его в YAML для вас (и выполняет правильную сериализацию). Поля строк ограничены по размеру и будут содержать только особо-малые значения.

обновление:

точная реализация будет зависеть от вашей базы данных, но PostgreSQL теперь имеет json и jsonb столбцы, которые могут изначально хранить ваши данные хэша / объекта и позволяют вам запрос к JSON с ActiveRecord!

измените миграцию, и все готово.

class Migration0001
  def change
    add_column :users, :location_data, :json, default: {}
  end
end

оригинал:

для более подробной информации:rails docs && apidock

убедитесь, что ваш столбец :text, а не :string

миграция:

$ rails g migration add_location_data_to_users location_data:text

создать:

class Migration0001
  def change
    add_column :users, :location_data, :text
  end
end

Ваш Класс Будет Выглядеть Так:

class User < ActiveRecord::Base
  serialize :location_data
end

Доступные Действия:

b = User.new
b.location_data = [1,2,{foot: 3, bart: "noodles"}]
b.save

Более Удивительным?!

использовать postgresql hstore

class AddHstore < ActiveRecord::Migration  
  def up
    enable_extension :hstore
  end

  def down
    disable_extension :hstore
  end
end 

class Migration0001
  def change
    add_column :users, :location_data, :hstore
  end
end

С помощью hstore вы можете установить атрибуты в сериализованном поле

class User < ActiveRecord::Base  
  # setup hstore
  store_accessor :location_data, :city, :state
end

Rails 4 имеет новую функцию под названием магазине, Так что вы можете легко использовать его, чтобы решить вашу проблему. Вы можете определить для него метод доступа, и рекомендуется объявить столбец базы данных, используемый для сериализованного хранилища, как текст, поэтому есть много места. Исходный пример:

class User < ActiveRecord::Base
  store :settings, accessors: [ :color, :homepage ], coder: JSON
end

u = User.new(color: 'black', homepage: '37signals.com')
u.color                          # Accessor stored attribute
u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor

# There is no difference between strings and symbols for accessing custom attributes
u.settings[:country]  # => 'Denmark'
u.settings['country'] # => 'Denmark'

Comments

    Ничего не найдено.