Преобразование объекта в га sh в Ruby - PullRequest
0 голосов
/ 28 мая 2020

В Ruby (без Rails) есть простой способ преобразовать объект в ha sh? Я провел несколько поисков и аналогичных решений Rails, когда OP попытался использовать .attributes. Есть что-нибудь подобное в простом Ruby? Любые драгоценные камни?

Каждый из этих объектов представляет собой строку из файла CSV, который я создаю здесь:

game_teams_data = CSV.read(location[:game_teams], headers: true, header_converters: :symbol)
    @@game_teams = game_teams_data.map do |row|

Затем я получаю доступ к объекту здесь в перечисляемом

@@game_teams.each do |game|
     game
end

Не уверен, влияет ли это на то, как я могу выполнить приведенное ниже преобразование.

Мой объект #<GameTeam:0x00007ffe9c97d158 @game_id="2012030154", @team_id="30", @hoa="home", @result="LOSS">

Результат, которого я пытаюсь достичь hash = {game_id => "2012030154", team_id => "30", hoa => "home", result => "LOSS"}

Ответы [ 2 ]

4 голосов
/ 28 мая 2020

Я бы добавил метод to_h в класс GameTeam:

class GameTeam
  # existing code

  def to_h
    { game_id: @game_id, team_id: @team_id, hoa: @hoa, result: @result }
  end
end

И затем вызвал бы этот метод следующим образом:

@@game_teams.each do |game_team|
  game_team.to_h
end
1 голос
/ 28 мая 2020

Если вы не можете обновить GameTeam, чтобы добавить метод to_h, вы можете получить необходимые переменные экземпляра и создать свои собственные:

class GameTeam
  def initialize(game_id, hoa, result, team_id)
    @game_id = game_id
    @hoa = hoa
    @result = result
    @team_id = team_id
  end
end

obj = GameTeam.new('2012030154', 'home', 'LOSS', '30')
%i[game_id hoa result team_id].map { |ivar| [ivar, obj.instance_variable_get("@#{ivar}")] }.to_h
# {:game_id=>"2012030154", :hoa=>"home", :result=>"LOSS", :team_id=>"30"}
...