【发布时间】:2015-07-10 09:21:28
【问题描述】:
我有一个模型Item,可以通过创建Vote 对其进行投票。 Vote 有一个属性:ip 记录了用户的ip 地址。如果一个 Item 的 Votes 数组包含特定的 ip,则该 ip 将被阻止创建另一个 Vote。
型号:
class Thing < ActiveRecord::Base
has_many :votes
end
class Vote < ActiveRecord::Base
belongs_to :thing
end
items_controller:
def vote
@item = Item.find(params[:id])
if (!@item.votes.map(&:ip).include? request.remote_ip)
Vote.create!(ip: request.remote_ip, item_id: @item.id)
end
end
这个模型现在没有那么慢。但我担心当我开始获得数百万票时会发生什么。在一个实例中,我正在获取当前 ip 尚未投票的每个 Item 的数组。随着投票数量的增加,这将是一个疯狂的记录数量。有谁知道更好的方法吗?
我的一个想法如下:
1.) 使用用户的 ip 加载一个投票数组:@votes = Vote.where(ip: request.remote_ip)
2.) 创建与这些投票关联的项目 (@items) 数组
3.) 从Item.all 中“减去”@items 以创建一个新数组@unvoted_items
4.) 检查@unvoted_items 是否包含当前项目
这会是一个更有效的模型吗?谁能想到更好的?
【问题讨论】:
标签: ruby-on-rails ruby arrays database performance