コメントを投稿にリンクする必要があります。ただし、コメントは (ユーザーが生成した) 単純なテキスト、(システムが生成した) リンク、または (システムが生成した) 画像の場合があります。
最初は、全員が同じ属性を共有していました。そのため、カテゴリ属性を作成し、そのカテゴリに基づいてテキスト属性でさまざまなことを行う必要がありました。
例:
class Comment < ActiveRecord::Base
belongs_to :post
belongs_to :author, :class_name => "User"
CATEGORY_POST = "post"
CATEGORY_IMAGE = "image"
CATEGORY_LINK = "link"
validates :text, :author, :category, :post, :presence => true
validates_inclusion_of :category, :in => [CATEGORY_POST, CATEGORY_IMAGE, CATEGORY_LINK]
attr_accessible :author, :text, :category, :post
def is_post?
self.category == CATEGORY_POST
end
def is_link?
self.category == CATEGORY_LINK
end
def is_image?
self.category == CATEGORY_IMAGE
end
end
ただし、一般的な「テキスト」プロパティのすべての値をダンプするのはきれいに感じられないため、これでは十分ではありません。そこで、ポリモーフィック モデルを作成することを考えていました (必要に応じてファクトリ パターンで)。しかし、ポリモーフィック モデルについてググると、投稿に対するコメントのような例が得られますが、ページに対する同じコメント、一種の関係が得られます。ポリモーフィックについての私の理解は異なりますか (異なるスコープで同じように動作するモデルと比較して、異なる状況で異なる動作をするモデル)?
では、このような関係を築くにはどうすればよいでしょうか。
私は考えていました(そして私を訂正してください)
Post
id
Comment
id
post_id
category (a enum/string or integer)
type_id (references either PostComment, LinkComment or ImageComment based on category)
author_id
PostComment
id
text
LinkComment
id
link
ImageComment
id
path
User (aka Author)
id
name
しかし、post.comments (または author.comments) を呼び出してすべてのコメントを取得できるようにモデルをセットアップする方法がわかりません。あると便利なのは、コメントの作成がリンク/画像/ポストコメント (ファクトリーとして機能するコメント) ではなく、コメントを通じて行われることです。
私の主な質問は、activerecord モデルをセットアップして関係を維持する方法です (作成者にはコメントがあり、投稿にはコメントがあります。コメントはリンク、画像、または投稿コメントのいずれかです)。