Допустим, у меня есть Gift
объект с @name = "book"
& @price = 15.95
. Как лучше всего преобразовать это в хэш {name: "book", price: 15.95}
в Ruby, а не в Rails (хотя не стесняйтесь давать и ответ Rails)?
ruby
object
hashmap
instance-variables
ma11hew28
источник
источник
Gift
это так же , как @nash определил , за исключением того , 2) убедитесь, что переменные экземпляра могут иметь читателя аксессоров. 3) Вся атрибутика в подарок.Ответы:
В качестве альтернативы
each_with_object
:источник
var.to_s.delete("@")
на,var[1..-1].to_sym
чтобы получить символы.gift.instance_variables.each_with_object({}) { |var,hash| hash[var.to_s.delete("@")] = gift.instance_variable_get(var) }
и избавьтесь от; hash
each
.map
иinject
намного мощнее. Это одна из проблем дизайна, которые у меня есть с Ruby:map
иinject
они реализованы с помощьюeach
. Это просто плохая информатика.hash = Hash[gift.instance_variables.map { |var| [var.to_s[1..-1], gift.instance_variable_get(var)] } ]
Просто скажи (текущий объект)
.attributes
.attributes
возвращаетhash
любой изobject
. И он намного чище.источник
.values
: sequel.jeremyevans.net/rdoc/classes/Sequel/Model/…instance_values
может использоваться для всех объектов Ruby для аналогичного вывода.Реализовать
#to_hash
?источник
Use :: for describing class methods, # for describing instance methods, and use . for example code
(источник: ruby-doc.org/documentation-guidelines.html ) Кроме того, официальная документация (например, ruby CHANGELOG, github.com/ruby/ruby/blob/v2_1_0/NEWS ) использует#
методы экземпляра и точку для методов класса довольно последовательно.each_with_object
instance_variables.each_with_object(Hash.new(0)) { |element, hash| hash["#{element}".delete("@").to_sym] = instance_variable_get(element) }
источник
instance_values
. Обратите внимание, что Мэтт попросил использовать Ruby, а не Rails.Вы можете использовать
as_json
метод. Он преобразует ваш объект в хэш.Но этот хеш будет иметь значение для имени этого объекта в качестве ключа. В твоем случае,
Если вам нужен хэш, хранящийся в объекте, используйте
as_json(root: false)
. Думаю по умолчанию root будет ложным. Для получения дополнительной информации обратитесь к официальному руководству по рубину.http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
источник
Для объектов Active Record
а потом просто позвони
источник
Если вы не работаете в среде Rails (т.е. у вас нет ActiveRecord), это может быть полезно:
источник
источник
Вы можете написать очень элегантное решение, используя функциональный стиль.
источник
Вы должны переопределить
inspect
метод своего объекта, чтобы он возвращал желаемый хэш, или просто реализовать аналогичный метод, не отменяя поведение объекта по умолчанию.Если вы хотите стать более привлекательным, вы можете перебирать переменные экземпляра объекта с помощью object.instance_variables
источник
Рекурсивно преобразуйте ваши объекты в хэш с помощью хешируемого гема ( https://rubygems.org/gems/hashable ). Пример
источник
Может, хочу попробовать
instance_values
. Это сработало для меня.источник
Создает неглубокую копию в виде хеш-объекта только атрибутов модели
Проверить тип полученного объекта
источник
Если вам нужно преобразовать и вложенные объекты.
источник
Gift.new.attributes.symbolize_keys
источник
Чтобы сделать это без Rails, чистый способ - хранить атрибуты в константе.
А затем, чтобы преобразовать экземпляр
Gift
в aHash
, вы можете:Это хороший способ сделать это, потому что он будет включать только то, что вы определяете
attr_accessor
, а не каждую переменную экземпляра.источник
Я начал использовать структуры, чтобы упростить хэш-преобразования. Вместо использования простой структуры я создаю свой собственный класс, производный от хэша, это позволяет вам создавать свои собственные функции и документировать свойства класса.
источник