在我的工作中,我们让评委执行各种任务,例如评价电影或比较两段文字。
我们正在设计一个新数据库来保存我们所有的数据(我们已经有了一些数据,但它所在的数据库非常糟糕),我开始构建一个Rails分析应用程序来提供服务作为这些判断的仪表板。表格将包括评委,电影,文本,MovieRatings,TextComparisons等内容。
作为应用程序的一部分,我们希望能够从这些表中添加注释或标记项。例如,某人可能想要向法官1添加评论,说“此判断非常不一致”,并在评级2中添加评论,说“此评级是意外的”,或标记不同类型的电影或文本以供审阅。
处理向数据库添加注释或标志的最佳方法是什么?例如,我们是否要为每个实体创建一个新的Comment表(添加JudgesComments,MoviesComments,TextComments等)?或者我们是否想要一个带有(id,comment)列的评论表[我想,这将要求整个数据库中的ID在数据库中是全局唯一的,而不是仅在其表中唯一]?
答案 0 :(得分:3)
您应该使用多态关联,这样您将拥有一个评论模型和控制器。根据优秀的#154 "Polymorphic Association" Railscast,在您的commentable_type:string
表格中添加commentable_id:integer
和comments
后,您的代码应如下所示:
# app/models/comment.rb
class Comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true
end
# app/models/judge.rb
class Judge < ActiveRecord::Base
has_many :comments, :as => :commentable
end
# app/models/movie.rb
class Movie < ActiveRecord::Base
has_many :comments, :as => :commentable
end
# app/models/text.rb
class Text < ActiveRecord::Base
has_many :comments, :as => :commentable
end
# app/controllers/comments_controller.rb
def index
@commentable = find_commentable
@comments = @commentable.comments
end
def create
@commentable = find_commentable
@comment = @commentable.comments.build(params[:comment])
if @comment.save
flash[:notice] = "Successfully created comment."
redirect_to :id => nil
else
render :action => 'new'
end
end
private
def find_commentable
params.each do |name, value|
if name =~ /(.+)_id$/
return $1.classify.constantize.find(value)
end
end
nil
end
在路线中:
# config/routes.rb
map.resources :judges, :has_many => :comments
map.resources :movies, :has_many => :comments
map.resources :texts, :has_many => :comments
并在视图中:
<!-- app/views/comments/index.html.erb -->
<div id="comments">
<% for comment in @comments %>
<div class="comment">
<%=simple_format comment.content %>
</div>
<% end %>
</div>
<h2>New Comment</h2>
<%= form_for [@commentable, Comment.new] do |f| %>
<p>
<%= f.label :content %><br />
<%= f.text_area :content %>
</p>
<p><%= f.submit "Submit" %></p>
<% end %>
答案 1 :(得分:1)
答案 2 :(得分:1)
我曾在一个系统中工作,其中只有一个评论表,并且每个表中的每个记录都有一个全局唯一的ID,您可以对其进行评论。系统工作正常,不难维护,新人很容易看到它是如何工作的。根据计算机标准,在可评论表中生成新记录的速度很慢,但对于系统用户来说,这并不是真正的问题。