フォーラムがあります。すべてのユーザーには投稿と返信があります。すべての投稿には返信があります。ユーザーが投稿を表示するたびに、Views テーブルにレコードを作成します (または最後の reply_id で更新します)。投稿にまだ返信がない場合は、user_id と post_id を保存します。投稿への返信がある場合は、投稿を表示した時点での最後の返信の user_id、post_id、reply_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の方法でこれを行う方法を誰かが知っているかどうか知りたいです。いくつかのスマートな(チェーンされた)スコープが機能すると推測していますが、頭を包むことはできません。