我正在尝试实施一个投票系统,用户可以对其他用户发布的链接进行upvote / downvote。用户只能对链接进行一次投票,所以在执行upvote或downvote之前,我需要检查用户是否已经投票,如果他们已经投票,他们投票或投票,以便我可以禁用其他按钮
有几种方法可以做到这一点。我最直接的解决方案是在链接模型中增加两个列,一个用于存储upvoted的用户ID列表,另一个用于存储downvoted的用户ID列表。
我脑子里出现了两个问题。一,这甚至被认为是一种很好的做法(在数据库效率方面),如果这是最好的方法,我如何存储一个id列表作为模型的属性?我需要为迁移输入什么数据类型?
答案 0 :(得分:1)
不,将投票存储为字段中的ID列表并不是一个好习惯。您违反了数据库的1NF。 1NF wiki
想象一下,这种情况发生在数百万票的数量上,不仅存储效率低下,而且如果你想看看选民是否投票给定对象,还想象取出和扫描整个列表。
更好的解决方案是让"Vote"
表格包含"voter_id", "voted_for_id", "vote_value"
等列。
正确的索引将确保您即使在非常大的数据上也能非常有效地完成大部分操作。例如: - 找一个候选人的票数/投票数,或者找一个人是否已经投票给候选人等。
答案 1 :(得分:0)
是否可以将一个id列表存储为rails中对象的属性?
是的,有可能。一种方法是使用Array
数据类型作为
def change
add_column :links, :upvote_user_ids, :array, :default => []
end
这甚至被认为是一种很好的做法(就数据库效率而言)
不,完全没有推荐。在一段时间内,列表会爆炸,彻底破坏您的系统..
考虑acts_as_votable
gem,这会优雅地解决您的问题..