我想锁定特定记录的更新时间。我使用acts_as_votable gem并希望每隔3或5分钟允许一次upvote。
只要记录通过upvote更新,列updated_at
就会获得一个新的时间戳。
我尝试通过验证(或更好的before_save
?)和我的模型中的代码片段实现此目的:
errors.add(:base, "Try again later.") if self.updated_at < (DateTime.now - 5.minutes)
但这实际上并不起作用。你们有什么想法吗?
提前致谢!
答案 0 :(得分:2)
Hello在验证时使用自定义方法,并使用field_name_was
方法从db获取以前的值。
在我们要编写的验证中调用方法。
validate :updated_at_validation
def updated_at_validation
old_date = self.updated_at_was
if old_date > (DateTime.now - 5.minutes)
errors.add(:updated_at, "can't be changed in less than 5 minutes")
end
end
&#13;
在你的控制器中,
def vote
if @feature_request.update_attributes(:updated_at => DateTime.now)
@feature_request.vote_by voter: current_user, :duplicate => true
redirect_to :back
else
redirect_to feature_requests_url, alert: 'cant be changed in less than 5 minutes'
end
end
&#13;
这就是你的自定义验证设置。
答案 1 :(得分:1)
您需要与保存的值进行比较,而不是新值。 尝试这样的事情:
self.updated_at_was < (DateTime.now - 5.minutes)
答案 2 :(得分:1)
就我在[1]的代码中看到的那样,投票将在每次新记录时保存为关系。因此,尝试使用updated_at是没用的 作为变化的指标。
您应该通过请求投票表来尝试找到最新的投票 重要的信息,然后采取行动。
[1] https://github.com/ryanto/acts_as_votable/tree/master/lib/acts_as_votable