1

ユーザーがコンテンツ (投稿) を公開できる StackOverflow に似たサイトを運営しています。また、編集者が選んだ注目の投稿を紹介するフロントページもあります。

ユーザーがいつでも投稿を編集できるようにしたいのですが、編集者による最初のレビューなしではフロントページに何も表示されないようにしたいと考えています。

これを解決するために、Post を特集するたびにpaper_trail現在のバージョンを保存するようなバージョン管理システムを実装できると考えました。version_idこのようにして、編集者がレビューしたコンテンツをフロントページに簡単に取得しながら、ユーザーのプロフィールなど、サイトの重要度の低い部分に最新バージョンを表示することができます。当社の編集者は定期的に変更を確認し、承認することができます。

共有インターフェイスと最小限の重複コードを維持しながら、一部のコントローラーでレビュー済みのバージョンを選択し、他のコントローラーで最新バージョンを選択できる最もクリーンなアプローチは何だろうと思っています。


理想的なソリューションにはスコープが含まれているため、レビュー済みのバージョンをreviewed簡単に取得して取得し、最新バージョンを取得できます。Post.reviewedPost.all

ただし、レビュー済みのバージョンを取得するには、オブジェクト PaperTrail ストア ( version.reify) を逆シリアル化する必要があり、スコープ内では不可能と思われるため、これについてどうすればよいかわかりません。

代わりに、次のようにクラス メソッドを使用できます。

def self.reviewed all.map do |post| Version.find(post.version_id).reify end.compact! || Post.none end

ただし、これは実際のスコープではないため、チェーン化できないなど、理想的とは言えません。

または、次のような Post インスタンス メソッドを使用することもできます。

def reviewed_version Version.find(version_id).reify end

これは理論的には機能しますが、これは、ビュー全体でこのメソッドを呼び出す必要があることを意味しますが、正しいデータをフェッチするのはコントローラーの責任です。render collection: @postsフロントページとユーザー プロファイルの両方に を持っているとしましょ_post.html.erbreviewed_version


私は PaperTrail に縛られているわけではありませんが、複製する必要のない優れた点がたくさんあります。ただし、PaperTrail が柔軟性に欠けると判明した場合は、他の方向性を検討することもできます。

FWIW、私は Draftsman も見ました、「ドラフト」は例外と見なされます (つまり、ほとんどの場合、ドラフトは表示されません)。一方、私の場合は、ほとんどのページで最新バージョンを表示したいのですが、フロントページのような特定のいくつかを除いて.

4

1 に答える 1