0

我有一种预感,这已经是一种 hack,但我仍然对此感到好奇:

说我有这个:

current_user.memories.where("content LIKE '%#{search}%' OR note LIKE '%#{search}%' OR date LIKE '%#{search}%'")

这是一个搜索字段。

在我的数据库中,在“记忆”表中,我有content:text 和 note:string,所以通过前两个比较,这个技巧很好用。

但是,日期部分显然不起作用。我在内存表中也有一个date:date列,但我不知道如何检查字符串是否匹配。

我可以将字符串格式化为 2013-01-15 之类的格式,但我不知道如何进行此比较。不知何故也将“日期”部分更改为该字符串?

整个事情背后的想法是允许像 2013-01-15 (或某种格式)这样的搜索,它也会自动检查“内存”对象的日期。

建议表示赞赏。

(如果重要的话,数据库是 postgres。)

4

2 回答 2

2

首先,你不应该使用字符串插值来构建 SQL,让 ActiveRecord 处理这些东西。其次,如果您searchISO 8601格式(即 YYYY-MM-DD),那么您可以直接将日期列与使用的字符串进行比较=,PostgreSQL 会找出答案。你想要更像这样的东西:

current_user.memories.where(%q{
       content like :pat
    or note    like :pat
    or date       = :date
}, :pat => "%#{search}%", :date => search)
于 2013-02-02T04:45:19.137 回答
0

您可以使用 to_date(text, text) 将搜索词转换为日期。如有必要,您可能还必须从日期字段中删除时间部分

解释在这里

于 2013-02-02T04:02:44.853 回答