Rails created_at查询

时间:2011-11-15 13:45:32

标签: ruby-on-rails ruby activerecord

在rails我做了这个功能(这里我有一个格式2011-09-01T14:24:09.090Z进入里面的时间)

time = params[:time].sub!(/\..*/,'')
@pictures = Picture.all
finalPictures = []
@pictures.each do |picture|
date = picture.created_at
if date > time
  finalPictures.push(picture)
 end
end
@pictures = finalPictures

这是为了查找一段时间后拍摄的所有照片。它产生了4个结果(全部在之后制作)我用查询替换了它。

@pictures = Picture.where("created_at >= :time", {:time => time})

这显然应该找到所有拍摄的照片。但它什么都不产生。如果我用

替换它
@pictures = Picture.where("created_at <= :time", {:time => time})

它产生了正确的结果,这里发生了什么。我知道我似乎应该使用正确的方法,但这意味着我需要更改大量的查询(我想我没有足够的测试)。我可以因为我的时间格式而得到这种行为,我应该以另一种方式改变它(以及我如何需要)?或者这就是created_at函数的工作方式

2 个答案:

答案 0 :(得分:1)

您不应该关注格式化时间,因为传递给查询的对象应该是DateTime,Time或Date。如果您没有其中之一,则需要将其调整为:

time = DateTime.parse(params[:time])

至于为什么你的时间没有被正确定义,你应该看一下log/development.log生成并登录的查询,看它是否在自己执行时正常工作。

调用Picture.all然后迭代是一种非常糟糕的方法,因为我确信你已经意识到,所以让查询正常工作非常重要。

答案 1 :(得分:0)

我在这种情况下做的第一件事是,我转到rails控制台并检查原始SQL。

为此,请在rails console中设置:

ActiveRecord::Base.logger = Logger.new(STDOUT)

然后运行你的方法

Picture.where("created_at >= :time", {:time => time})

然后你会看到发生了什么,因为这应该有用。