2010-12-16 4 views
1

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

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

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

класс User < ActiveRecord :: Base

has_many: голоса

has_many: темы

класс Тема < ActiveRecord :: Base

has_many: голосов

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

класса Голосуйте < ActiveRecord :: Base

BELONGS_TO: темы

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

булева #tracks выбора выбирает ли пользователь нравится или не нравится

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

< класс User ActiveRecord :: Base

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

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

ответ

0

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

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