1

この質問では、データベース用に 2 つのテーブルがあります。

  • 投稿 (has_many :comments)
  • ActivityFeed (belongs_to item, :polymorphic)
  • コメント (belongs_to :post)

Facebook のグループ内で次の一連のアクションが発生するとします。

  1. ユーザー A がステータス「ステータス 1」を投稿しました
  2. ユーザー B がステータス「ステータス 2」を投稿しました

そして、これら 2 つの投稿のそれぞれが、グループの FeedItem (アクティビティ) の作成をトリガーしました。

ユーザーがページをロードすると、フィード アクティビティは created_at/updated_at でソートされます。フィード アクティビティは、オブジェクトのポリモーフィック セットです (投稿、写真、投票、ファイルなど)。

すぐにユーザー A がユーザー B の投稿にコメントした場合、フィードの正しい順序は次のようになります。

  1. 「ステータス2」
  2. 「ステータス1」

では、ユーザー A が「ステータス 2」にコメントするとどうなるでしょうか? 関連する投稿 (コメントが追加されている場所) を見つけて、投稿が関連するアクティビティからタイムスタンプを更新する必要がありますか?

そのためのアドバイスが必要です。ありがとう!


アップデート

class Comment < ActiveRecord:Base
  belongs_to :post, touch: true
end

class Post < ActiveRecord:Base
  has_many :comments
  act_as_activity -> on_create will create a Activity representing this object
end

class Activity < ActiveRecord:Base
  belongs_to :item, :polymorphic => true
  belongs_to :parent, :polymorphic => true
  belongs_to :user
end

フィードには複数の種類のオブジェクトを含めることができるため、フィード クエリはアクティビティ テーブルを検索します。クエリは Activity テーブルで実行されるため、投稿にコメントを付けるときは、タイムスタンプをこのテーブルで更新する必要があります。

SELECT * FROM Activity 
              ORDER BY updated_at
4

2 に答える 2

2

私の理解が正しければ、投稿は「最新」順に表示されるはずです。投稿にコメントを追加すると、その「最新」の時間が更新されます。

ここで試してみましょう。:touch と呼ばれる belongs_to アソシエーションのオプションがあります。このオプションを追加すると、投稿にコメントを追加すると、コメントが関連付けに追加 (または削除) されるたびに、投稿の updated_at フィールドが更新されます。

http://guides.rubyonrails.org/association_basics.html

例えば:

class Comment < ActiveRecord:Base
  belongs_to :post, touch: true
end

class Post < ActiveRecord:Base
  has_many :comments
end

次に、Post インスタンスの :updated_at フィールドで並べ替えを行います。

于 2013-01-18T14:00:44.630 に答える
1

after_create コールバックを使用する bdares のアイデアを使用すると、次のようになります。

class Comment
  belongs_to :post, touch: true
  after_create do 
     self.post.activity.last_update_at = Time.now
     self.post.activity.save!
  end
end

これは、Activityそのlast_update_atフィールドで並べ替えていることを意味します。

于 2013-01-18T16:56:17.000 に答える