[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.열 유형이 잘못되었습니다. 대신 문자열의 문자를 사용해야합니다. 따라서 마이그레이션이 있어야한다 :
열 유형이 잘못되었습니다. 대신 문자열의 문자를 사용해야합니다. 따라서 마이그레이션이 있어야한다 :
def self.up add_column :users, :multi_wrong, :text end
그런 다음 레일이 제대로 당신을 위해 YAML로 변환 (적절한 직렬화를 수행) 할 것이다. 문자열 필드의 크기는 제한되어 있습니다 만, 특히-작은 값을 개최한다.
-
==============================
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.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'
from https://stackoverflow.com/questions/6694432/using-rails-serialize-to-save-hash-to-database by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일에서보기 당 자바 스크립트 파일 (0) | 2020.02.07 |
---|---|
[RUBY-ON-RAILS] 가 현재 설치되어 있지 있다고 말해 계속 레일 (0) | 2020.02.07 |
[RUBY-ON-RAILS] 두 액티브 :: 관계 개체를 결합 (0) | 2020.02.07 |
[RUBY-ON-RAILS] ActiveRecord.find (array_of_ids), 보존하기 위해 (0) | 2020.02.07 |
[RUBY-ON-RAILS] 레일에 액티브 제거 3 (0) | 2020.02.07 |