0

我正在尝试在范围内使用 DateTime.parse 将字符串转换为时间,但是出现未定义的局部变量错误。

是否可以在范围内转换字段,还是我需要尝试其他方法?

我的范围:

  scope :time_range, lambda {
    a = DateTime.parse(start_time_am)
    where("#{a} <= ?", Time.now.strftime('%H'))
  }  

- 更新 -

在玩过这个之后,我发现我可能应该覆盖默认访问器。我现在有以下内容:

  def start_time_am
    read_attribute(:start_time_am).strftime("%H%M").to_i
  end

在控制台中,我的 start_time_am 字段现在看起来像:

 Promotion.last.start_time_am
  => 430 

但是,如果我想暂时定义一个新字段,那么我仍然可以使用初始字段。

我可以在控制台中访问它,但在搜索时不能。例如。

   def start_time_new
     read_attribute(:start_time_am).strftime("%H%M").to_i
   end

  def self.time_range
    time = Time.now.strftime('%H%M').to_i
    where("start_time_new <= ?", time)
  end

给出一个未知的列错误。我以为 attr_reader 会解决,但它不起作用。

谢谢

4

2 回答 2

3

如果您将其重写为等效的方法定义,则可能更容易弄清楚。

def self.time_range
  a = DateTime.parse(start_time_am)
  where("#{a} <= ?", Time.now.strftime('%H'))
end

start_time_am 来自哪里?该方法没有任何参数。

于 2012-09-23T10:50:00.980 回答
0

最后,我在 where 语句中做了转换,去掉了虚拟属性:

def self.time_available
  where("cast(start_time as time) <= cast(now() as time) and cast(end_time as time) >= cast(now() as time)")
end

希望对某人有所帮助

于 2012-09-24T14:55:43.787 回答