Rails:记录更新时间锁定

时间:2016-02-25 11:37:30

标签: ruby-on-rails

我想锁定特定记录的更新时间。我使用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)

但这实际上并不起作用。你们有什么想法吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

Hello在验证时使用自定义方法,并使用field_name_was方法从db获取以前的值。

在我们要编写的验证中调用方法。

validate :updated_at_validation

&#13;
&#13;
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;
&#13;
&#13;

在你的控制器中,

&#13;
&#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;
&#13;
&#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