0

我有一个看起来像这样的 Post 模型:

#  id         :integer         
#  author_id  :integer         
#  owner_id   :integer         
#  owner_type :string(255)
#  content    :text    

class Post < ActiveRecord::Base
  belongs_to :author, class_name: 'User'
  belongs_to :owner, polymorphic: true
end

所有者可以是用户、组或地点。我想知道为评论建模的最佳方法是什么。考虑到它与 Post 共享大部分属性,我认为相同的 Post 模型可以用作 Comment,使用如下关系:

has_many :comments, class_name: 'Post', :as => :owner

但实际上我对这个解决方案一点也不满意,因为 Post 使用相同的关系来存储它的所有者。

最好创建一个不同的模型来发表评论?性病怎么办?

4

3 回答 3

1

为了对现实世界进行抽象并保持简单(清晰、简洁),我的建议是使用 Comment 模型:

class Comment < ActiveRecord::Base
  belongs_to :post
end

class Post < ActiveRecord::Base
  belongs_to :author, class_name: 'User'
  belongs_to :owner, polymorphic: true
  has_many :comments
end

如果您打算向另一个实体(例如照片)添加评论,请使用多态关联:

class Comment < ActiveRecord::Base
  belongs_to :commentable, :polymorphic => true
end

class Post < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

class Photo < ActiveRecord::Base
  has_many :comments, :as => :commentable
  #...
end
于 2013-10-11T15:19:49.013 回答
0

rails 教程就是这样做的:guides.rubyonrails.org/getting_started.html。它创建了一个带有帖子模型和附加评论控制器的博客。

resources :posts do
  resources :comments
end

运行这个

$ rails generate controller Comments

并将其添加到生成的控制器中:

class CommentsController < ApplicationController
  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment].permit(:commenter, :body))
    redirect_to post_path(@post)
  end
end
于 2013-10-11T15:20:12.107 回答
0

你应该看看这个 railscast:

http://railscasts.com/episodes/154-polymorphic-association?view=asciicast

它有点旧,但它是免费的之一。您确实想为您的评论创建一个不同的模型,并且您想创建一个多态关联。

于 2013-10-11T15:23:26.037 回答