개체를 해시로 루비 변환
예를 들어, 나에게Gift
에 반대하는.@name = "book"
&@price = 15.95
그것을 해시로 변환하는 가장 좋은 방법은 무엇입니까?{name: "book", price: 15.95}
Rails가 아니라 Ruby에서? (Rails도 자유롭게 대답해주세요)
Just say (현재 개체).attributes
.attributes
를 반환합니다.hash
어느 것 하나object
그리고 훨씬 더 깨끗합니다.
class Gift
def initialize
@name = "book"
@price = 15.95
end
end
gift = Gift.new
hash = {}
gift.instance_variables.each {|var| hash[var.to_s.delete("@")] = gift.instance_variable_get(var) }
p hash # => {"name"=>"book", "price"=>15.95}
또는each_with_object
:
gift = Gift.new
hash = gift.instance_variables.each_with_object({}) { |var, hash| hash[var.to_s.delete("@")] = gift.instance_variable_get(var) }
p hash # => {"name"=>"book", "price"=>15.95}
시행하다#to_hash
?
class Gift
def to_hash
hash = {}
instance_variables.each { |var| hash[var.to_s.delete('@')] = instance_variable_get(var) }
hash
end
end
h = Gift.new("Book", 19).to_hash
Gift.new.instance_values # => {"name"=>"book", "price"=>15.95}
사용할 수 있습니다.as_json
방법.개체를 해시로 변환합니다.
그러나 해당 해시는 해당 개체의 이름을 키로 지정하는 값으로 표시됩니다.당신의 경우에는,
{'gift' => {'name' => 'book', 'price' => 15.95 }}
개체에 저장된 해시가 필요한 경우 사용as_json(root: false)
기본적으로 루트는 false일 것입니다.자세한 내용은 공식 루비 가이드를 참조하십시오.
http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
활성 레코드 개체의 경우
module ActiveRecordExtension
def to_hash
hash = {}; self.attributes.each { |k,v| hash[k] = v }
return hash
end
end
class Gift < ActiveRecord::Base
include ActiveRecordExtension
....
end
class Purchase < ActiveRecord::Base
include ActiveRecordExtension
....
end
그런 다음 그냥 전화하세요.
gift.to_hash()
purch.to_hash()
class Gift
def to_hash
instance_variables.map do |var|
[var[1..-1].to_sym, instance_variable_get(var)]
end.to_h
end
end
레일즈 환경이 아닌 경우(즉, ActiveRecord를 사용할 수 없는 경우) 이 방법이 도움이 될 수 있습니다.
JSON.parse( object.to_json )
기능적 스타일을 사용하여 매우 우아한 솔루션을 작성할 수 있습니다.
class Object
def hashify
Hash[instance_variables.map { |v| [v.to_s[1..-1].to_sym, instance_variable_get v] }]
end
end
'recurrentable' gem(https://rubygems.org/gems/hashable) 예를 사용하여 개체를 해시로 재귀적으로 변환합니다.
class A
include Hashable
attr_accessor :blist
def initialize
@blist = [ B.new(1), { 'b' => B.new(2) } ]
end
end
class B
include Hashable
attr_accessor :id
def initialize(id); @id = id; end
end
a = A.new
a.to_dh # or a.to_deep_hash
# {:blist=>[{:id=>1}, {"b"=>{:id=>2}}]}
당신은 그것을 무시해야 합니다.inspect
원하는 해시를 반환하거나 기본 개체 동작을 재정의하지 않고 유사한 메서드를 구현하는 개체의 메서드입니다.
더 화려하게 만들고 싶다면 object.instance_variables를 사용하여 개체의 인스턴스 변수를 반복할 수 있습니다.
해보고 싶을 수도 있음instance_values
그것은 저에게 효과가 있었습니다.
위의 댓글에서 @Mr.L을 표절하려면, 시도하세요.@gift.attributes.to_options
.
사용할 수 있습니다.symbolize_keys
사용할 수 있는 중첩 속성이 있는 경우deep_symbolize_keys
:
gift.as_json.symbolize_keys => {name: "book", price: 15.95}
모델 속성만 있는 해시 개체로 얕은 복사본을 생성합니다.
my_hash_gift = gift.attributes.dup
결과 개체의 유형 확인
my_hash_gift.class
=> Hash
중첩된 개체도 변환해야 하는 경우.
# @fn to_hash obj {{{
# @brief Convert object to hash
#
# @return [Hash] Hash representing converted object
#
def to_hash obj
Hash[obj.instance_variables.map { |key|
variable = obj.instance_variable_get key
[key.to_s[1..-1].to_sym,
if variable.respond_to? <:some_method> then
hashify variable
else
variable
end
]
}]
end # }}}
Gift.new.attributes.기호_키
레일 없이 이 작업을 수행하려면 속성을 상수에 저장하는 것이 좋습니다.
class Gift
ATTRIBUTES = [:name, :price]
attr_accessor(*ATTRIBUTES)
end
그런 다음, 의 인스턴스를 변환합니다.Gift
아주Hash
할 수 있는 일:
class Gift
...
def to_h
ATTRIBUTES.each_with_object({}) do |attribute_name, memo|
memo[attribute_name] = send(attribute_name)
end
end
end
이 방법은 사용자가 정의한 내용만 포함하기 때문에 이 작업을 수행하는 것입니다.attr_accessor
모든 인스턴스 변수는 아닙니다.
class Gift
ATTRIBUTES = [:name, :price]
attr_accessor(*ATTRIBUTES)
def create_random_instance_variable
@xyz = 123
end
def to_h
ATTRIBUTES.each_with_object({}) do |attribute_name, memo|
memo[attribute_name] = send(attribute_name)
end
end
end
g = Gift.new
g.name = "Foo"
g.price = 5.25
g.to_h
#=> {:name=>"Foo", :price=>5.25}
g.create_random_instance_variable
g.to_h
#=> {:name=>"Foo", :price=>5.25}
해시 변환을 쉽게 하기 위해 구조체를 사용하기 시작했습니다.맨 구조체를 사용하는 대신 해시에서 파생된 나만의 클래스를 만듭니다. 이것은 당신 자신의 함수를 만들 수 있게 해주고 클래스의 속성을 문서화합니다.
require 'ostruct'
BaseGift = Struct.new(:name, :price)
class Gift < BaseGift
def initialize(name, price)
super(name, price)
end
# ... more user defined methods here.
end
g = Gift.new('pearls', 20)
g.to_h # returns: {:name=>"pearls", :price=>20}
내가 컴파일하지 못한 네이트의 답변에 따라:
옵션 1
class Object
def to_hash
instance_variables.map{ |v| Hash[v.to_s.delete("@").to_sym, instance_variable_get(v)] }.inject(:merge)
end
end
그런 다음 이렇게 부릅니다.
my_object.to_hash[:my_variable_name]
옵션 2
class Object
def to_hash
instance_variables.map{ |v| Hash[v.to_s.delete("@"), instance_variable_get(v)] }.inject(:merge)
end
end
그런 다음 이렇게 부릅니다.
my_object.to_hash["my_variable_name"]
언급URL : https://stackoverflow.com/questions/5030553/ruby-convert-object-to-hash
'programing' 카테고리의 다른 글
안드로이드 앱의 릴리스 버전을 구축하기 전에 디버그 로깅 호출을 모두 제거하는 방법은 무엇입니까? (0) | 2023.06.02 |
---|---|
유닉스 타임스탬프(에포크 이후 초)를 루비 날짜 시간으로 변환하는 방법은 무엇입니까? (0) | 2023.06.02 |
루비에서 문자열이나 정수를 이진수로 변환하는 방법은 무엇입니까? (0) | 2023.06.02 |
SSL 인증서를 신뢰할 수 없음 - 모바일에서만 (0) | 2023.06.02 |
레일:포함 대 :조인트 (0) | 2023.06.02 |