我从Ruby收到此错误:
`语法错误,意外',',expecting => ban = Ban.where(:banned => 1,expires<?",current_time)^
我也遇到了这个错误:
undefined method 'expires' for #<Ban::ActiveRecord_Relation
如果我删除:banned => 1,
这是我的代码:
class Ban < ActiveRecord::Base
before_create :unban
def unban
puts "starting unban"
current_time = Time.now
puts current_time
ban = Ban.where(:banned => 1, "expires < ?", current_time)
if current_time > ban.expires
ban.update_attributes(:banned => 0)
puts "worked"
end
end
end
答案 0 :(得分:3)
你在where子句条件类型中混合了;一个是哈希条件,另一个是替换参数。您可以使用较短的方法,它使用单个字符串,如下所示:
ban = Ban.where("banned = 1 and expires < ?", current_time)
或单独,如下:
ban = Ban.where(banned: 1).where("expires < ?", current_time)
在这种情况下,我会选择第一种方法;使用哈希条件的便利性不会抵消使用2 where子句增加的复杂性。
查询将检索多个答案,因此您无法直接访问单个记录。这就是您使用expires
收到错误的原因。您还应该在尝试使用其中的数据之前验证查询是否已返回记录。你可以试试这个:
if ban.length > 0 && current_time > ban.first.expires
或将查询结果和if
语句更改为:
ban = Ban.where("banned = 1 and expires < ?", current_time).first
if ban && current_time > ban.expires
答案 1 :(得分:2)
你应该使用字符串或散列表示法,即:
Ban.where(banned: 1).where('expires < ?', current_time)
此外,当您使用where
时,它会返回一组记录,而不是单个Ban
实例,因此请使用ban.first.expires
(不要忘记,结果可以是nil
你也应该检查一下。