gpt4 book ai didi

ruby-on-rails - Ruby 动态解包行

转载 作者:数据小太阳 更新时间:2023-10-29 08:47:37 24 4
gpt4 key购买 nike

我想在变量 core_game_fields 中的一个位置决定从我的数据库中获取哪些字段。该字段将始终包含 :id,然后它将包含我决定的任何其他内容。我只想在一个地方设置这个字段,然后让代码获取这些字段,然后为我将其解压到散列中。现在这段代码有效,但你可以看到这意味着我必须硬编码,并重复我想要获取的变量 3 次,而不是仅仅 1 次。

mh = {}

core_game_fields = [:id, :date, :season, :away_team_id, :home_team_id]
stuff = Game.pluck(*core_game_fields)

stuff.each do |id, date, season, away_team_id, home_team_id|
mh[id] = { :date => date,
:season => season,
:away_team_id => away_team_id,
:home_team_id => home_team_id }
end

最佳答案

这是您可以执行此操作的一种方法(Ruby 1.9.3):

mh = stuff.each_with_object({}) do |row,h|
h[row[0]] = Hash[fields[1, fields.length].zip(row[1, row.length])]
end

这是它的工作原理:

  1. stuff.each_with_object({}) do |row,h|mh 哈希开始,并将它传递给每个迭代结果集中的一行,以便可以将子哈希添加到其中。参见 Enumerable#each_with_object .

  2. h[row[0]] 将行的 ID 作为子哈希的键。

  3. fields[1, fields.length] 切掉除第一个之外的所有字段符号,并返回它们作为一个数组,例如 [:date, :season, :away_team_id, :home_team_id]

  4. 字段符号数组为zipped together与行数据

    zip(row[1, row.length])] == zip([date_val, season_val, ...etc])

    索引 0 处的元素组合在一个子数组中,然后是索引 1,依此类推,直到得到 [[:date, date_val], [:season, season_val], ...etc ].

  5. Hash[Step #4] 将键/值对数组转换为实际哈希,然后分配给集合哈希 h行的 ID。

如果你不想把它全部放在一行中,你可以像这样把它分开:

sub_fields = fields[1, fields.length]

mh = stuff.each_with_object({}) do |row,h|
id, rest = row[0], row[1, row.length]
h[id] = Hash[sub_fields.zip rest]
end

关于ruby-on-rails - Ruby 动态解包行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22906344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com