Datamapper - 获取关联的大多数关联N记录(例如:5个最喜欢的帖子)

时间:2014-05-13 19:23:50

标签: ruby sinatra datamapper

我正在我的博客上工作,这是一个使用Datamapper作为其ORM的Sinatra应用程序。我刚刚为hash-tags添加了一个功能。哈希标签就是这样,它与“故事”的多对多关系。我需要在侧栏上显示最常用/最常用的5个哈希标签。

以下是我感兴趣的模态的摘要。

哈希标记模型

class Hashtag

  include DataMapper::Resource

  has n, :stories, through: Resource

  def self.default_repository_name
    :default
  end

  property        :id,                Serial
  property        :created_at,        DateTime
  property        :updated_at,        DateTime

  property        :hashtag,           String
end

故事模型:

# File: models/story.rb


class Story

  include DataMapper::Resource

  def self.default_repository_name
    :default
  end

  belongs_to :person
  belongs_to :category

  has 1, :story_content

  has n, :comments
  has n, :hashtags, through: Resource


  property        :id,                Serial
  property        :created_at,        DateTime
  property        :updated_at,        DateTime

  property        :published,         Boolean,    default: false
  property        :privacy_level,     Enum[ :private, :friends, :public ] # SNS access control for Twitter/FB only

end

需要:获得最常用n哈希标记的最有效方法。

  • 标签1~> 1个故事
  • 标签2~> 2个故事
  • 标签3~> 3个故事

对于n = 2,我需要〜> [标签2,标签3]

我正在考虑维持一个柜台并为某些事情做过这样的事情,比如喜欢'。不知道是否有任何其他方式缓存StoriesHashTag的数量。

1 个答案:

答案 0 :(得分:1)

由于top标签​​不太可能频繁更改,因此您可以选择计算并缓存它们更长的时间,例如一天。然后,您可以在夜间工作中重新计算前五名。

优点:

  • 没有额外的故事_帐号列
  • 没有维护stories_count(不容易处理!)
  • 快速查询

缺点:

  • 前5名可能已过期(如果您预计会经常更改,则不是选项)
  • 需要建立和配置夜间工作