出乎意料的',',期待=>禁止错误

时间:2016-05-23 00:06:55

标签: ruby-on-rails ruby activerecord rails-activerecord

我从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

2 个答案:

答案 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你也应该检查一下。