0

コメントを投稿にリンクする必要があります。ただし、コメントは (ユーザーが生成した) 単純なテキスト、(システムが生成した) リンク、または (システムが生成した) 画像の場合があります。

最初は、全員が同じ属性を共有していました。そのため、カテゴリ属性を作成し、そのカテゴリに基づいてテキスト属性でさまざまなことを行う必要がありました。

例:

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 モデルをセットアップして関係を維持する方法です (作成者にはコメントがあり、投稿にはコメントがあります。コメントはリンク、画像、または投稿コメントのいずれかです)。

4

1 に答える 1

1

主な質問であるモデルのセットアップについてのみお答えします。コメントを除いて、質問で使用した列とテーブルを考えると、次の設定を使用できます。

 # comment.rb
 # change category to category_type
 # change type_id to category_id
 class Comment < ActiveRecord::Base
   belongs_to :category, polymorphic: true
   belongs_to :post
   belongs_to :author, class_name: 'User'
 end

 class PostComment < ActiveRecord::Base
   has_one :comment, as: :category
 end

 class LinkComment < ActiveRecord::Base
   has_one :comment, as: :category
 end

 class ImageComment < ActiveRecord::Base
   has_one :comment, as: :category
 end

そのセットアップでは、次のことができます。

 >> post = Post.first
 >> comments = post.comments
 >> comments.each do |comment|
      case comment.category_type
      when 'ImageComment'
        puts comment.category.path
      when 'LinkComment'
        puts comment.category.link
      when 'PostComment'
        puts comment.category.text
      end
    end
于 2013-02-19T10:24:15.870 に答える