2

您将如何设计一种可以多态地应用于多个模型/类的内容投票机制。(最好在 ruby​​ on rails 上下文中,但其他都很好)

鉴于可以对这些类的实例进行投票: - 文章 - 问题 - 产品

不应要求选民登记。

应尽最大努力将选民限制为每个对象一票。(对特定文章投一票,对特定问题投一票,等等)。即使用ip检测、cookies等。

4

3 回答 3

2

我建议从“可投票”接口的单表继承开始,并从那里派生任何可投票类。STI 的起始细节:http ://wiki.rubyonrails.org/rails/pages/singletableinheritance

于 2008-11-04T16:04:16.517 回答
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。:)

于 2008-11-06T14:26:02.923 回答
0

谢谢你们的答案。是的,创建一个多态可投票模型是要走的路,但是我试图提取一个更完整的答案。

例如,这是我到目前为止的想法。在这种情况下,可以与多个类(文章、问题、产品)绑定的可投票类。

投票表:id:integer、vote:boolean、voteable_type:string(被投票的类的名称)、voteable_id:integer(被投票的类的id)、voter_id(用户投票的标识符)。

现在我们仍然需要尝试将投票限制为每个用户一个,而不需要某种注册。所以 voter_id 可以是一个包含用户 IP 地址和 user_agent 的组合。这是我对想法持开放态度的地方。如果捕获的 IP 地址来自公司代理等,则它们不一定是唯一的,因此结合用户代理应该有所帮助。但是,您仍然会遇到两个用户可以拥有相同 IP 和用户代理字符串的情况。此外,如果他们的浏览器未在请求标头中发送此信息,您可能并不总是能够获得此信息,这意味着某些用户根本无法投票……此外,IP 可能会被欺骗。

另一种可能性是使用 cookie,但我认为这会引起用户的滥用,他们希望通过清除 cookie 或脚本命中来提高对特定内容的投票率。在此处检查用户代理也应该有所帮助,但是您可以通过脚本轻松地伪造用户代理。

可能没有完美的解决方案,但我很好奇其他人是如何解决这个问题的。即黑客新闻甚至stackoverflow。

于 2008-11-07T14:26:19.913 回答