我应该在Rails中使用哈希值还是新类来获得成就?

时间:2015-10-26 22:53:29

标签: ruby-on-rails ruby activerecord

我在铁轨上练习红宝石,我试图为用户添加成就。我想知道是否有人可以解释在新班级上使用哈希的好处/损害。

例如,如果我的对象有一个" has_many"与"成就"的关系对象,或者应该有"成就"哈希,为什么?我主要关心数据库速度的影响。

1 个答案:

答案 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模型可以轻松转换为使用静态数据。