您将如何设计一种可以多态地应用于多个模型/类的内容投票机制。(最好在 ruby on rails 上下文中,但其他都很好)
鉴于可以对这些类的实例进行投票: - 文章 - 问题 - 产品
不应要求选民登记。
应尽最大努力将选民限制为每个对象一票。(对特定文章投一票,对特定问题投一票,等等)。即使用ip检测、cookies等。
您将如何设计一种可以多态地应用于多个模型/类的内容投票机制。(最好在 ruby on rails 上下文中,但其他都很好)
鉴于可以对这些类的实例进行投票: - 文章 - 问题 - 产品
不应要求选民登记。
应尽最大努力将选民限制为每个对象一票。(对特定文章投一票,对特定问题投一票,等等)。即使用ip检测、cookies等。
我建议从“可投票”接口的单表继承开始,并从那里派生任何可投票类。STI 的起始细节:http ://wiki.rubyonrails.org/rails/pages/singletableinheritance
你说的是多态——这是关键词。
看看 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。:)
谢谢你们的答案。是的,创建一个多态可投票模型是要走的路,但是我试图提取一个更完整的答案。
例如,这是我到目前为止的想法。在这种情况下,可以与多个类(文章、问题、产品)绑定的可投票类。
投票表:id:integer、vote:boolean、voteable_type:string(被投票的类的名称)、voteable_id:integer(被投票的类的id)、voter_id(用户投票的标识符)。
现在我们仍然需要尝试将投票限制为每个用户一个,而不需要某种注册。所以 voter_id 可以是一个包含用户 IP 地址和 user_agent 的组合。这是我对想法持开放态度的地方。如果捕获的 IP 地址来自公司代理等,则它们不一定是唯一的,因此结合用户代理应该有所帮助。但是,您仍然会遇到两个用户可以拥有相同 IP 和用户代理字符串的情况。此外,如果他们的浏览器未在请求标头中发送此信息,您可能并不总是能够获得此信息,这意味着某些用户根本无法投票……此外,IP 可能会被欺骗。
另一种可能性是使用 cookie,但我认为这会引起用户的滥用,他们希望通过清除 cookie 或脚本命中来提高对特定内容的投票率。在此处检查用户代理也应该有所帮助,但是您可以通过脚本轻松地伪造用户代理。
可能没有完美的解决方案,但我很好奇其他人是如何解决这个问题的。即黑客新闻甚至stackoverflow。