我正在构建一个带有游戏数据库表的应用程序。所有游戏都有不同的属性,尽管每个游戏的某些属性相同,主要是名称和类型。我将所有属性存储在一个单独的表中,以便可以搜索它们。每个游戏都与属性有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,最好的方法是什么?我可以使用函数或回调吗?
答案 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;]将返回与该游戏相关的所有属性对象。这最终会隐藏活动记录关系,因此您可能希望定义一个新方法,而不是根据您打算执行的操作覆盖此方法。