1

現在、次のようないいねの数を追跡するカウンターキャッシュを使用してレコードを注文しています。

Post.order("COALESCE(likes_count, 0) DESC").limit(10)

アイテムのソートに使用されるキャッシュなどに時間制限を組み込む方法はありますか? たとえば、過去 24 時間以内に作成されたいいね! のみが含まれます。

いいねは次のように処理されます。

like.rb

belongs_to :liker, class_name: "User"
belongs_to :liked, class_name: "Post", :counter_cache => :likes_count
validates :liker_id, presence: true
validates :liked_id, presence: true

user.rb

has_many :likes, foreign_key: "liker_id", dependent: :destroy
has_many :liked_posts, through: :likes, source: :liked

post.rb

has_many :likes, foreign_key: "liked_id", dependent: :destroy
has_many :liker_users, through: :likes, source: :liker

答えてくれてありがとう。大変感謝しています。

4

2 に答える 2

0

私は最近似たようなことをしました。私がしたことは、投稿モデルに列を追加することでした:

t.string :state, :default => nil

それから、基本的に特定の期間内の「いいね!」で投稿を並べ替え、:state を「trending」に設定する「Trending」というレーキ タスクを作成しました。

trending_posts = Post.trending.first(100)
trending_posts.each do |post|
   post.update_attributes(:state => “trending”)
end

ここで「トレンド」は、私が post.rb で定義したメソッドです (ただし、Postgres の場合)。

def self.trending
  joins("LEFT OUTER JOIN Likes ON likes.post_id = post.id 
                   AND likes.created_at >= (now() - interval '24 hour')")
                  .group("post.id").order("COUNT(likes.id) DESC”)
end

rake タスクを実行するときは、最初に古い傾向の製品をフラッシュする必要があります。つまり、状態を nil に設定する必要があります。そうしないと、レーキ ランが台無しになります。その後、このレーキ タスクを毎日自動的に実行し、コントローラでトレンド状態の投稿を参照するだけです。

@trending_posts = Post.where(:state => “trending”)

このようにして、人気のある状態 (先月最も多くのいいね! が付いた投稿) またはその他の状態を作成することもできます。別の名前を付けて、新しい rake タスクを作成するだけです。

于 2014-04-03T11:13:39.867 に答える