2015-10-26 51 views
1

我在轨道上练习红宝石,我试图给用户添加成就。我想知道是否有人可以解释使用散列而不是新类的好处/不利之处。我应该在Rails中使用哈希还是新类来实现成就?

例如,我的对象应该与“成就”对象具有“has_many”关系,还是应该有“成就”散列?为什么?我主要关心数据库速度的影响。

+0

你的问题使用不同的措词,但它基本上在这里回答:http://stackoverflow.com/questions/33270251/why-in-the-world-would-i-have-many-relationships。序列化“哈希”并嵌入模型在您试图回答的问题的上下文中在功能上是相同的。 –

+0

如果我正在尝试查找具有多项成就的用户,那么该怎么办?这种关系本身会减慢它的速度吗? – Suavocado

+0

@Mike:不,使用'serialize'几乎总是一个错误,并且在功能上远不及使用关系和单独的表。试图在数据库查询中查看序列化的'Hash'是疯狂的,加入单独的表格是快速,干净和容易的。使用PostgreSQL及其'jsonb'列类型可以解决大部分'serialize'问题,但即使如此,单独的表格通常也是更好的选择。 –

回答

2

我的对象应该与“成就”对象有has_many关系,还是应该有“成就”散列,为什么?

我肯定推荐has_many关系基于后端数据库 - 它可以让你根据您的需要(而不是用自定义方法乱搞)建立关联数据的能力。

你还必须认识到ActiveRecord会为你建立一个散列,对吧?

唯一的区别是,ActiveRecord会用你的数据库中的数据填充散列,而我相信你会讨论静态数据的散列(我没有大量的经验)。

-

因为这个问题没有很多答案,这是我怎么会做它:

#app/models/achievement.rb 
class Achievement < ActiveRecord::Base 
    ## you could attach this to MongoDB or some other file-based storage system 
    has_many :awards 
    has_many :users, through : :awards 
end 

#app/models/award.rb 
class Award < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :achievement 
end 

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :awards 
    has_many :achievements, through: :award 
end 

这是一个标准has_many :through关系。我想你已经知道了,所以我不会因为细节而让你感到厌烦。然而,你必须记住,这种类型的设置是Rails中的一个标准 - 它会给你所需的功能,而不需要你想法可能需要的任何定制。

它会给你打电话以下的能力:

@awards = Award.joins(:achievements).where(user_id: @current_user.id) 

这将需要一个DB调用带回所有成就为单个用户,所有相关的。

数据将被封装在 - 基本上是一系列哈希,从db中填充。

Achievement模型可以很容易地转换为使用静态数据。