如何将链接记录转换为哈希?

时间:2016-09-28 20:29:20

标签: ruby-on-rails ruby ruby-on-rails-5

我正在构建一个带有游戏数据库表的应用程序。所有游戏都有不同的属性,尽管每个游戏的某些属性相同,主要是名称和类型。我将所有属性存储在一个单独的表中,以便可以搜索它们。每个游戏都与属性有has_many的关系。

Table games
id       int     primary key
name     string  unique
type     string

Table attributes
id       int     primary_key
game_id  int
name     string
value    text

例如游戏" Nyan Cat Adventures in Space" (组成名称)可以具有以下属性:

id   game_id    name      value
4    344        dlc       99
5    344        packages  2209
6    344        language  "Space Cat"
7    344        dlc       551

我需要完全可搜索(和索引)的属性。我希望能够将属性转换为哈希,以便我可以访问某些属性:game.attributes['dlc']。但请注意,某些属性可以具有相同的名称。如果我扩展ActiveRecord :: Base,最好的方法是什么?我可以使用函数或回调吗?

2 个答案:

答案 0 :(得分:1)

如果您有games = Game.all等记录列表 和Game个对象有关联的DLC个对象,你可以这样做:

game_hashes_with_dlc_info = games.map do |game|
  game.attributes.merge(dlc: game.dlc.map(&:attributes))
end

回应您的评论

给出像{ foo: "1", foo: "2", bar: "1", bar: "2" }

这样的哈希值

您要转为{ foo: ["1", "2"], bar: ["1", "2"] }

hash_1.reduce({}) do |new_hash, (hash_1_key, hash_1_val)|
  if new_hash.has_key? hash_1_key
    new_hash[hash_1_key].push(hash_1_val)
  else
    new_hash[hash_1_key] = [hash_1_val]
  end
  new_hash
end

这具有使所有哈希值数组的效果,这可能不是您想要的。

答案 1 :(得分:0)

你可以使用group_by来获得你想要的东西。以下内容可能会奏效。

class Game < ActiveRecord::Base
    has_many :game_attributes, :class_name => "Attribute"

    def game_attributes
        result = super
        result.to_a.group_by{|a| a["name"]}
    end
end

这意味着game.game_attributes [&#34; dlc&#34;]将返回与该游戏相关的所有属性对象。这最终会隐藏活动记录关系,因此您可能希望定义一个新方法,而不是根据您打算执行的操作覆盖此方法。