我遇到的当前问题是,当我增加从用户创建的帖子数量时,有一个很长的停顿时间来访问我的新闻源所需的正确信息。
希望有人可以帮助我或指出正确的方向来优化我目前的方法
def newsfeed
@friends ||= self.in_friends.where("friends.status =
'Accepted'").includes(:posts) + self.out_friends.where("friends.status = 'Accepted'").includes(:posts)
@something = self.profile_posts.where("owner_id = ?", self.id)
@posts = []
@friends.each { |friend| @posts += friend.posts }
@newsfeed = @posts + @something
@newsfeed.sort! { |a, b| b.created_at <=> a.created_at }
end
这不是一个非常干净的查询,并希望能够更好地学习/实现更快的建议。
进一步的信息是相关的表是
create_table "friends", force: :cascade do |t|
t.integer "friender_id", null: false
t.string "status", default: "Pending", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "friendee_id"
t.index ["friendee_id"], name: "index_friends_on_friendee_id"
t.index ["friender_id"], name: "index_friends_on_friender_id"
end
create_table "posts", force: :cascade do |t|
t.integer "owner_id", null: false
t.string "text", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "profile_id"
t.index ["owner_id"], name: "index_posts_on_owner_id"
end
我一直在努力实现的是用户朋友发布的所有帖子以及当前用户在个人资料页面上发布的帖子。沿着(friend2和posts2是别名)行的东西
select * from posts
join friend
join friend2
join posts2
where friend.friender_id = self.id and status = 'Accepted'
where friend2.friendee_id = self.id and status = 'Accepted'
where posts2 profile_id = self.id and owner_id = self.id
感谢所有帮助我解决这个问题的人。那些帮助我更好地提高我对'SQL'/'ActiveRecord'的理解的人。