Hacker News rails clone: ​​советы по моделированию отношений между ссылками, комментариями и голосами - PullRequest
1 голос
/ 02 марта 2011

Я люблю Rails, но мы только начали встречаться.

Пользователь может голосовать как за ссылки, так и за комментарии. В дополнение к первичному ключу и метке времени в настоящее время у меня есть следующие атрибуты, определенные для этих моделей:

  • Ссылка URL, заголовок, submitter_id, оценка
  • Комментарий содержание, commenter_id, оценка, link_id, parent_comment_id
  • Голосовать id, voter_id, link_id, direction

Я только что добавил модель комментариев и продумал, как интегрировать ее с голосами. Некоторые варианты:

  1. Сверните ссылки и комментарии в одну модель "Предмет" и сопоставьте голоса с общим item_id
  2. Имеется две таблицы голосования, одна для комментариев, одна для ссылок
  3. Добавить столбец comment_id в существующую таблицу голосования

Не уверен, что лучше. # 1 и # 3 представляют таблицы двойного назначения, то есть в таблице есть определенные столбцы, которые имеют отношение только к подмножествам строк в этой таблице. # 2 избегает этой проблемы, но кажется излишним и глупым.

Неужели компромисс неизбежен или я не вижу золотой путь? Чтобы вы посоветовали? И если вам случится знать о репозитории rails на github, который справляется с подобной ситуацией, я был бы очень благодарен за ссылку!

1 Ответ

3 голосов
/ 02 марта 2011

Я думаю, что вы ищете, это полиморфная ассоциация. В вашем случае это будет так просто:

class Vote < ActiveRecord::Base
  belongs_to :votable, :polymorphic => true
end

class Link < ActiveRecord::Base
  has_many :votes, :as => :votable
end

class Comment < ActiveRecord::Base
  has_many :votes, :as => :votable
  #...
end

Ваша таблица голосов должна выглядеть следующим образом:

id           : integer
votable_id   : integer 
votable_type : string # Comment || Link

Вот вам Railscast: Полиморфные ассоциации Railscast

...