在rails上建模评论

时间:2013-10-11 15:07:51

标签: ruby-on-rails database-design

我有一个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使用相同的关系来存储它的所有者。

最好为评论创建不同的模型? STI怎么样?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

你应该看看这个railscast:

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

它有点旧,但它是免费的之一。您确实希望为注释创建不同的模型,并且希望创建多态关联。