创建按日期和用户分组的供稿(以下),按最近在 ruby 和 rails 订购
Creating a feed (following) grouped by day and user that is ordered by most recent on ruby on rails
我正在尝试做一个 feed(每天按照 feed 的时间线)
我有一个 table photos
存储用户上传的照片,一个 table follows
存储每个用户关注的用户。
create_table "photos", force: :cascade do |t|
...
t.integer "user_id"
t.datetime "created_at"
t.datetime "updated_at"
...
create_table "follows", force: :cascade do |t|
t.integer "followable_id", null: false
t.string "followable_type", null: false
t.integer "follower_id", null: false
t.string "follower_type", null: false
...
t.datetime "created_at"
t.datetime "updated_at"
end
基本上,我想完成一个看起来像这样的提要(绘制比解释更容易)
- 最近出现在顶部
- 将我们是 "following" 的用户上传的所有照片分组,包括我自己的 "a day"
- 显示今天、昨天、2天前等
这是一种解决方案。
current_user_id = current_user.id
Photo.select(%q{
user_id,
COUNT(*) no_photos,
date_trunc('day', created_at::timestamp) as what_day
}).group("what_day, user_id").order("what_day DESC").where(%Q{
user_id IN (
(SELECT followable_id FROM follows where follower_id = #{current_user_id})
UNION ALL
(SELECT #{current_user_id} as followable_id)
)
})
date_trunc
将日期截断到指定的精度,在本例中是一天的开始。我不确定 follows.followable_type
在你的情况下做了什么,但上面应该有效。
我正在尝试做一个 feed(每天按照 feed 的时间线)
我有一个 table photos
存储用户上传的照片,一个 table follows
存储每个用户关注的用户。
create_table "photos", force: :cascade do |t|
...
t.integer "user_id"
t.datetime "created_at"
t.datetime "updated_at"
...
create_table "follows", force: :cascade do |t|
t.integer "followable_id", null: false
t.string "followable_type", null: false
t.integer "follower_id", null: false
t.string "follower_type", null: false
...
t.datetime "created_at"
t.datetime "updated_at"
end
基本上,我想完成一个看起来像这样的提要(绘制比解释更容易)
- 最近出现在顶部
- 将我们是 "following" 的用户上传的所有照片分组,包括我自己的 "a day"
- 显示今天、昨天、2天前等
这是一种解决方案。
current_user_id = current_user.id
Photo.select(%q{
user_id,
COUNT(*) no_photos,
date_trunc('day', created_at::timestamp) as what_day
}).group("what_day, user_id").order("what_day DESC").where(%Q{
user_id IN (
(SELECT followable_id FROM follows where follower_id = #{current_user_id})
UNION ALL
(SELECT #{current_user_id} as followable_id)
)
})
date_trunc
将日期截断到指定的精度,在本例中是一天的开始。我不确定 follows.followable_type
在你的情况下做了什么,但上面应该有效。