programing

개체를 해시로 루비 변환

powerit 2023. 6. 2. 21:23
반응형

개체를 해시로 루비 변환

예를 들어, 나에게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

반응형