Нравится / не нравится стиль голосования базы данных в Rails - PullRequest
1 голос
/ 16 декабря 2010

Я создаю функцию голосования для нашего веб-сайта в стиле YouTube «Нравится» и «Не нравится» и Digg с использованием Ruby on Rails 3. У меня возникают проблемы при выборе правильной схемы.

У меня есть три модели: пользователи, темы и голоса.Каждый пользователь получит один голос «Нравится» или «Не нравится» за одну тему.Как и эти сайты, пользователи могут голосовать за тему, но они также могут создавать новые темы.Я хотел бы иметь возможность просматривать не только все голоса пользователей, но и созданные ими темы и темы, за которые они проголосовали.Я пытаюсь построить это самостоятельно и решить, как лучше всего настроить базу данных для обработки этого процесса.

Моя первая идея состояла в том, чтобы использовать: has_many и assign_to исключительно как…

класс User

has_many: голоса

has_many: темы

класс Тема

has_many: голоса

Proper_To: пользователи

класс Голосовать

принадлежат_:: темы

принадлежат_: пользователи

логический выбор # отслеживает, выбирает ли пользователь Likeили не нравится

Но стало очевидно, что это может быть не лучшим способом сделать это.Я начал думать, что лучшим способом было бы использовать: has_many: посредством ассоциации, как ...

класс User

has_many: голоса,: через =>: темы

Но я не уверен.Любые идеи о том, как лучше настроить что-то подобное?

1 Ответ

0 голосов
/ 16 декабря 2010

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

class User < ActiveRecord::Base
  has_many :votes
  has_many :topics

  #Lists all topics the user has voted on
  has_many :voted_topics, :through => :votes, :source => :topic

  #Lists all votes for the users topics
  has_many :topic_votes, :through => :topics, :source => :votes
end

class Topic < ActiveRecord::Base
  has_many :votes
  belongs_to :user
end

class Vote < ActiveRecord::Base
  belongs_to :topic
  belongs_to :user
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...