Thanks for the answers guys. Yup, creating a polymorphic votable model is the way to go, however I was attempting to extract a more complete answer.
For example here's what I'm thinking so far. A voteable class which can be tied to multiple classes (Article, Question, Product) in this scenario.
Votes table: id:integer, vote:boolean, voteable_type:string (name of the class being voted on), voteable_id:integer (id of the class being voted on), voter_id (identifer for the user voting).
Now we still need to try and limit votes to one per user without requiring some sort of registration. So the voter_id could be a composite containing the user's IP address and user_agent. This is where I'm open to ideas. The IP address captured is not necessarily unique if they're coming from a corp proxy etc. so combining the user agent shoud help somewhat. However you still have cases where two user's can have the same IP and user agent string. Also, you may not always be able to obtain this information if their browser doesn't send it in the request header, meaning that some user's simply won't get to vote... Also, IPs can be spoofed.
Another possiblity would be using cookies, but I think this invites abuse from user's who want to spike the votes for a particular piece of content by clearing their cookies or scripting hits. Checking the user-agent here should help too, but you can fake a user-agent via script easily enough.
There probably is no perfect solution, but I'm curious how other's have approached this. I.e. hacker news and even stackoverflow.