在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函数的工作方式
答案 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})
然后你会看到发生了什么,因为这应该有用。