我有一个论坛。每个用户都有帖子和回复。每个帖子都有回复。每当用户查看帖子时,我都会在 Views 表中创建一条记录(或使用最后一个 reply_id 更新它)。假设一个帖子还没有任何回复,那么我只需保存 user_id 和 post_id。如果有对帖子的回复,那么我保存 user_id、post_id 和在帖子查看时最后回复的回复 ID。
我正在尝试创建一个“搜索未读帖子”页面,向用户显示他们尚未阅读的任何帖子,或者是否对他们已经查看的帖子有新的回复。我相信你们中的大多数人都熟悉这个原则,因为大多数论坛引擎都有这种搜索,但我想确保不要留下任何问题。
以下是关联(除去所有权限检查和其他关联):
class User < ActiveRecord::Base
has_many :posts
has_many :views
end
class Post < ActiveRecord::Base
belongs_to :user
has_many :replies
has_many :views
has_one :latest_reply, :order => "created_at DESC", :class_name => "Reply", :conditions => { :replystatus => 'published' }
end
class Reply < ActiveRecord::Base
belongs_to :post
belongs_to :user
has_many :views
end
class View < ActiveRecord::Base
belongs_to :post
belongs_to :reply
belongs_to :user
end
我想知道如何只获取用户根本没有阅读的帖子(视图中没有记录),或者帖子 latest_reply.id 大于保存在视图中的帖子。我已经想出了如何在 sql 中编写这个查询(使用连接、子查询和联合),但我想知道是否有人知道用 Rails 方式来执行此操作。我猜一些智能(链式)范围会起作用,但我就是无法理解它。