orangelight
orangelight

Reputation: 11

Like/Dislike style Voting Database in Rails

I’m creating a voting feature for our website in the style of YouTube “Likes” and “Dislikes” and Digg using Ruby on Rails 3. I have having trouble coming up with the right scheme.

I have three models, Users, Topics, and Votes. Each User will make one vote “Like” or “Dislike” for one Topic. Like these sites, Users can Vote on a Topic, but they can also create new Topics. I’d like to be able to not only view all of a User’s Votes, but also both the Topics they have created and the Topics they have voted on. I am trying to build this on our own and decide how best to setup the database to handle this process.

My first idea was to use :has_many and belongs_to exclusively like so…

class User < ActiveRecord::Base

has_many :votes

has_many :topics

class Topic < ActiveRecord::Base

has_many :votes

belongs_to :users

class Vote < ActiveRecord::Base

belongs_to :topics

belongs_to :users

boolean choice #tracks whether the User chooses Like or Dislike

But it became evident that this might not be the best way to do this. I began to think the best method would be to use a :has_many :through association like...

class User < ActiveRecord::Base

has_many :votes, :through => :topics

But I’m not sure. Any ideas on how best to set something like this up?

Upvotes: 1

Views: 832

Answers (1)

DanneManne
DanneManne

Reputation: 21180

I think your initial setup is good but it can be further improved upon to better support what you want to accomplish. Perhaps like this:

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

Upvotes: 0

Related Questions