Rails ActiveRecord按日期查找/搜索

Rails ActiveRecord按日期查找/搜索,activerecord,ruby-on-rails-3.2,Activerecord,Ruby On Rails 3.2,我试图通过“created_at”date查找记录-数据库列类型为“datetime”,并且 我正在使用jQuery中的UI日期选择器 我的url如下所示:“localhost:3000/用户\u支持?所选\u日期=2012-10-31” 到目前为止,我做得很好:),我在controller中的查询如下所示: @support_histories = current_agent.support_histories.where(:created_at => Date.parse(params

我试图通过“created_at”date查找记录-数据库列类型为“datetime”,并且 我正在使用jQuery中的UI日期选择器

我的url如下所示:“localhost:3000/用户\u支持?所选\u日期=2012-10-31”

到目前为止,我做得很好:),我在controller中的查询如下所示:

@support_histories = current_agent.support_histories.where(:created_at => Date.parse(params[:selected_date]))
如何仅从“datetime”数据库列按“date”正确提取记录

我尝试在Rails控制台中执行此操作,但没有成功:

sh = SupportHistory.where(:created_at => DateTime.parse('2012-10-31'))
sh = SupportHistory.where(:created_at => Date.parse('2012-10-31'))
sh = SupportHistory.where(:created_at => DateTime.strptime('2012-10-31', '%Y-%m-%d'))
我有记录,如果我喜欢下面提到的,但这对我没有用处,因为我试图找到记录的'日期',而不是'日期时间'

sh = SupportHistory.where(:created_at => '2012-10-31 19:49:57')

时区可能是您需要考虑的问题,但如果您的所有时间都在同一时区,则这应该会起作用。

我通过在下面的模型中创建一个方法解决了这个问题, 喂,我的型号是ticket.rb

 def created_date
   self.created_at.to_date
 end
然后我就这样问,

 selected_date = Date.parse(params[:date])

 Ticket.all.map{|t| t if t.created_date == selected_date}.compact

这为我提供了与用户选择的日期匹配的准确结果。

我有时使用的一个简单解决方案是在数据库中将日期(时间)字段转换为文本,而不是在应用程序端将字符串解析为日期。对于您的情况,这将是:

where('CAST(created_at AS text) LIKE ?', params[:selected_date])

在数据库上可能不是最有效的(取决于您在其中使用它的上下文),但在应用程序方面节省了大量pita。

我没有话要感谢您,但我必须说我爱您;)-我对编码不熟悉,整天都在尝试:)我仍然想知道-有没有办法查询不包括时间的数据库?的第2.2.2节与我给出的答案类似。你可能会做一些创造性的事情,比如选择(“日期(创建时间)为有序的日期)。where(:ordered\u date=>\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu“获取表中的所有票证,并将它们展开为内存中的数组。不利于内存消耗和性能。另外,不要在“map”之后再执行“compact”(很可能在整个票证集合中循环两次!),只需使用“select”方法,它一次过滤集合。但归根结底,杰森·诺布尔的答案是正确的,因为“where”并不像“all”那样将所有内容扩展到内存中。
where('CAST(created_at AS text) LIKE ?', params[:selected_date])