我在铁轨上练习红宝石,我试图为用户添加成就。我想知道是否有人可以解释在新班级上使用哈希的好处/损害。
例如,如果我的对象有一个" has_many"与"成就"的关系对象,或者应该有"成就"哈希,为什么?我主要关心数据库速度的影响。
答案 0 :(得分: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填充。
Achievement
模型可以轻松转换为使用静态数据。