2010-09-17 103 views
0

在我的工作,我们有法官执行多种任务,例如,速度的电影或者比较两段文本。与不同实体相关联的笔记在数据库

我们正在设计一个新的数据库来保存我们所有的数据(我们已经有一些数据,但它所在的数据库非常黑客),我开始构建一个Rails分析应用程序,它将担任这些判断的仪表板。表格将包括诸如法官,电影,文本,MovieRatings,文本比较等内容。

作为应用程序的一部分,我们希望能够从这些表中添加注释或标志的物品。例如,有人可能要添加注释来判断1说:“这位法官是非常不一致”,并加入到评级2评论说:“这个评级是意外”,或标记不同类型的电影或文字进行复查。

什么是处理添加注释或标记到数据库的最好方法?例如,我们是否想为每个实体创建一个新的评论表(添加JudgesComments,MoviesComments,TextComments等)?或[只在其表这,我想,就需要在整个数据库ID是在数据库中全球唯一的,而不是唯一]难道我们希望有(ID,评论)列一个表的评论?

回答

3

您应该使用多态关联,以便您将拥有一个评论模型和控制器。根据优秀#154 "Polymorphic Association" Railscast,加入commentable_type:stringcommentable_id:integercomments表后,你的代码应该是这个样子:

# 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

alt text

1

我在那里有一个评论表的系统工作过,并在每个表中的每个记录一个全局唯一的ID,你可以有一个评论。系统运行良好,不难维护,新人很容易看到它是如何工作的。根据计算机标准,在可评论的表中生成新记录的速度很慢,但对于系统用户来说这不是一个真正的问题。

+0

如何找到评论所附的原始记录/您如何知道要加入哪张表? – grautur 2010-09-17 20:58:18

+0

我们从未发现您从评论转到评论的项目的情况;我们总是从发票或其他任何东西开始,并问“这附带什么纸条?”如果我需要开始从评论到原始条目,我可能会在注释表中为注释项目的表格添加一列。 – mjfgates 2010-09-18 20:14:22

相关问题