将注释与数据库中的不同实体相关联

时间:2010-09-17 19:26:07

标签: ruby-on-rails database-design

在我的工作中,我们让评委执行各种任务,例如评价电影或比较两段文字。

我们正在设计一个新数据库来保存我们所有的数据(我们已经有了一些数据,但它所在的数据库非常糟糕),我开始构建一个Rails分析应用程序来提供服务作为这些判断的仪表板。表格将包括评委,电影,文本,MovieRatings,TextComparisons等内容。

作为应用程序的一部分,我们希望能够从这些表中添加注释或标记项。例如,某人可能想要向法官1添加评论,说“此判断非常不一致”,并在评级2中添加评论,说“此评级是意外的”,或标记不同类型的电影或文本以供审阅。

处理向数据库添加注释或标志的最佳方法是什么?例如,我们是否要为每个实体创建一个新的Comment表(添加JudgesComments,MoviesComments,TextComments等)?或者我们是否想要一个带有(id,comment)列的评论表[我想,这将要求整个数据库中的ID在数据库中是全局唯一的,而不是仅在其表中唯一]?

3 个答案:

答案 0 :(得分:3)

您应该使用多态关联,这样您将拥有一个评论模型和控制器。根据优秀的#154 "Polymorphic Association" Railscast,在您的commentable_type:string表格中添加commentable_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 :(得分:1)

alt text

答案 2 :(得分:1)

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