Ruby конвертирует Object в Hash - PullRequest
       23

Ruby конвертирует Object в Hash

113 голосов
/ 17 февраля 2011

Допустим, у меня есть Gift объект с @name = "book" & @price = 15.95. Какой лучший способ преобразовать это в Hash {name: "book", price: 15.95} в Ruby, а не в Rails (хотя не стесняйтесь давать ответ и Rails)?

Ответы [ 17 ]

4 голосов
/ 17 февраля 2011

Вы должны переопределить метод inspect вашего объекта, чтобы вернуть желаемый хеш, или просто реализовать аналогичный метод, не переопределяя поведение объекта по умолчанию.

Если вы хотите стать более изящным, вы можете повторитьпеременные экземпляра объекта с object.instance_variables

4 голосов
/ 23 августа 2016

Могу попробовать instance_values.Это сработало для меня.

1 голос
/ 18 ноября 2013

Создает поверхностную копию в виде хеш-объекта только для атрибутов модели

my_hash_gift = gift.attributes.dup

Проверка типа полученного объекта

my_hash_gift.class
=> Hash
0 голосов
/ 17 июня 2019

Чтобы сделать это без Rails, чистый способ - сохранить атрибуты на константе.

class Gift
  ATTRIBUTES = [:name, :price]
  attr_accessor(*ATTRIBUTES)
end

И затем, чтобы преобразовать экземпляр Gift в Hash, вы можете:1006 *

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}
0 голосов
/ 27 декабря 2017

Gift.new.attributes.symbolize_keys

0 голосов
/ 11 сентября 2012

Вы должны попробовать Hashie, замечательный драгоценный камень: https://github.com/intridea/hashie

0 голосов
/ 28 мая 2016

Если вам нужно конвертировать вложенные объекты.

# @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 # }}}
...