我在轨道上练习红宝石,我试图给用户添加成就。我想知道是否有人可以解释使用散列而不是新类的好处/不利之处。我应该在Rails中使用哈希还是新类来实现成就?
例如,我的对象应该与“成就”对象具有“has_many”关系,还是应该有“成就”散列?为什么?我主要关心数据库速度的影响。
我在轨道上练习红宝石,我试图给用户添加成就。我想知道是否有人可以解释使用散列而不是新类的好处/不利之处。我应该在Rails中使用哈希还是新类来实现成就?
例如,我的对象应该与“成就”对象具有“has_many”关系,还是应该有“成就”散列?为什么?我主要关心数据库速度的影响。
我的对象应该与“成就”对象有
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
模型可以很容易地转换为使用静态数据。
你的问题使用不同的措词,但它基本上在这里回答:http://stackoverflow.com/questions/33270251/why-in-the-world-would-i-have-many-relationships。序列化“哈希”并嵌入模型在您试图回答的问题的上下文中在功能上是相同的。 –
如果我正在尝试查找具有多项成就的用户,那么该怎么办?这种关系本身会减慢它的速度吗? – Suavocado
@Mike:不,使用'serialize'几乎总是一个错误,并且在功能上远不及使用关系和单独的表。试图在数据库查询中查看序列化的'Hash'是疯狂的,加入单独的表格是快速,干净和容易的。使用PostgreSQL及其'jsonb'列类型可以解决大部分'serialize'问题,但即使如此,单独的表格通常也是更好的选择。 –