我有一个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怎么样?
答案 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
它有点旧,但它是免费的之一。您确实希望为注释创建不同的模型,并且希望创建多态关联。