Связывание заметок с различными объектами в базе данных - PullRequest
0 голосов
/ 17 сентября 2010

На моей работе у нас есть судьи, которые выполняют различные задачи, например, оценивают фильмы или сравнивают два фрагмента текста.

Мы находимся в процессе разработки новой базы данных, которая будет содержать все наши данные (у нас уже есть некоторые данные, но база данных, в которой они находятся, довольно хакерская), и я начинаю создавать аналитическое приложение Rails, которое будет служить панелью для этих решений.Таблицы будут включать такие вещи, как судьи, фильмы, текст, оценки фильмов, сопоставления текста.

В рамках приложения мы хотим иметь возможность добавлять комментарии или помечать элементы из этих таблиц.Например, кто-то может захотеть добавить комментарий к Судье 1 со словами «Этот судья очень непоследователен» и добавить комментарий к Рейтингу 2 со словами «Этот рейтинг является неожиданным», или пометить различные типы фильмов или текстов для просмотра.

Каков наилучший способ обработки добавления комментариев или флагов в базу данных?Например, хотим ли мы создать новую таблицу комментариев для каждой сущности (добавить JudgesComments, MoviesComments, TextComments и т. Д.)?Или мы хотим иметь одну таблицу комментариев со столбцами (id, comment) [которая, я думаю, потребовала бы, чтобы идентификаторы по всей базе данных были глобально уникальными внутри базы данных, а не уникальными только внутри ее таблицы]?

Ответы [ 3 ]

3 голосов
/ 20 сентября 2010

Вы должны использовать полиморфные ассоциации , чтобы у вас была одна модель Comment и контроллер.Согласно отличному # 154 "Полиморфному объединению" 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 голос
/ 17 сентября 2010

Я работал в системе, в которой была единственная таблица комментариев и глобально уникальный идентификатор для каждой записи в каждой таблице, к которой вы могли бы иметь комментарий.Система работала нормально, не была сложной в обслуживании, и новым людям было легко увидеть, как она работает.Генерация новых записей в таблицах с возможностью комментирования была медленной по компьютерным стандартам, но для пользователей системы это не было проблемой.

1 голос
/ 17 сентября 2010

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...