您将如何设计可以多态应用于多个模型/类的内容投票机制。 (在铁轨上的红宝石上最好,但其他人都很好)
鉴于可以对这些类的实例进行投票: - 文章 - 题 - 产品
不应要求选民登记。
应该尽最大努力限制选民每个对象投一票。 (对特定文章投1票,对特定问题投1票等)。即使用ip检测,cookies等
答案 0 :(得分:2)
我建议从单表继承开始为'可投票'接口,并从那里派生任何可投票的类。 STI的详细信息:http://wiki.rubyonrails.org/rails/pages/singletableinheritance
答案 1 :(得分:1)
你说多态 - 这是关键词。
了解ActsAsTaggable的工作原理。您可以创建一个ActsAsVotable“插件”,为特定模型提供投票行为。投票将存储在另一个模型(投票?)中,该模型将具有多态的belongs_to。
create_table :orders do |t|
t.string :votable_type
t.integer :votable_id
t.integer :vote
t.timestamps
end
您的acts_as_votable
电话会在幕后将其与投票联系起来:
has_many :votes, :as => "votable"
再次,请参阅ActsAsTaggable。 :)
答案 2 :(得分:0)
谢谢你的回答。是的,创建一个多态的可投票模型是要走的路,但我试图提取一个更完整的答案。
例如,这是我到目前为止的想法。在这种情况下,可投票的类可以绑定到多个类(文章,问题,产品)。
投票表:id:整数,投票:boolean,voteable_type:字符串(正在投票的类的名称),voteable_id:整数(正在投票的类的id),voter_id(用户投票的标识符)。< / p>
现在我们仍然需要尝试将每个用户的投票限制为一个,而无需进行某种注册。因此voter_id可以是包含用户的IP地址和user_agent的复合。这是我对想法持开放态度的地方。如果它们来自公司代理等,则捕获的IP地址不一定是唯一的。因此组合用户代理应该有所帮助。但是,您仍然有两个用户可以拥有相同的IP和用户代理字符串的情况。此外,如果他们的浏览器没有在请求标题中发送此信息,您可能无法始终获取此信息,这意味着某些用户根本无法投票...此外,IP也可能被欺骗。
另一种可能性是使用cookie,但我认为这会引起用户的滥用,他们希望通过清除cookie或脚本命中来为特定内容进行投票。在这里检查用户代理也应该有所帮助,但是你可以通过脚本轻松伪造用户代理。
可能没有完美的解决方案,但我很好奇其他人是如何接近这一点的。即黑客新闻,甚至是stackoverflow。