복붙노트

[RUBY-ON-RAILS] 레일을 직렬화를 사용하여 데이터베이스에 해시를 저장합니다

RUBY-ON-RAILS

레일을 직렬화를 사용하여 데이터베이스에 해시를 저장합니다

내 레일 응용 프로그램에서 시도의 숫자로 해시 매핑 ID를 저장하려고하고 있습니다. 데이터베이스 내 이동이 새 열을 수용 할 수 :

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

나는 레일을 사용할 때 수행하여이를 테스트하기 위해 콘솔 :

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

출력은 거짓. 잘못된 무슨 일이야?

해결법

  1. ==============================

    1.열 유형이 잘못되었습니다. 대신 문자열의 문자를 사용해야합니다. 따라서 마이그레이션이 있어야한다 :

    열 유형이 잘못되었습니다. 대신 문자열의 문자를 사용해야합니다. 따라서 마이그레이션이 있어야한다 :

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

    그런 다음 레일이 제대로 당신을 위해 YAML로 변환 (적절한 직렬화를 수행) 할 것이다. 문자열 필드의 크기는 제한되어 있습니다 만, 특히-작은 값을 개최한다.

  2. ==============================

    2.업데이트 :

    업데이트 :

    정확한 구현은 데이터베이스에 따라 달라집니다 만, PostgreSQL는 이제 기본적으로 당신의 해시 / 오브젝트 데이터를 저장하고이 액티브와 JSON에 대한 쿼리에 허용 할 수 있습니다 JSON과 jsonb 열이 있습니다!

    마이그레이션을 변경하면됩니다.

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

    기발한:

    자세한 내용은 : 워드 프로세서 & & apidock 레일

    있는지 확인 열은 다음과 같습니다 텍스트가 아닌 : 문자열

    이주:

    $은 g 마이그레이션 add_location_data_to_users location_data 레일 : 텍스트를

    작성해야합니다 :

    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
    
  3. ==============================

    3.4 쉽게 문제를 해결하기 위해 사용할 수 있도록, 스토어라는 새로운 기능이 레일. 그래서 충분한 공간이있다, 당신은 그것에 대한 접근을 정의 할 수 있으며, 당신이 텍스트로 직렬화 저장에 사용되는 데이터베이스 컬럼을 선언하는 것이 좋습니다. 원래 예 :

    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'
    
  4. from https://stackoverflow.com/questions/6694432/using-rails-serialize-to-save-hash-to-database by cc-by-sa and MIT license