0

私はこれがすでに一種のハックであるという予感がありますが、それでも私はこれについて興味がありました:

私がこれを持っていると言う:

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

これは検索フィールド用です。

私のデータベースの「memories」テーブルには、content:textとnote:stringがあるので、最初の2つの比較まで、このトリックはうまく機能します。

ただし、明らかに日付部分は機能しません。メモリテーブルにもdate:date列がありますが、文字列との一致を確認する方法がわかりません。

文字列を2013-01-15のような形式にフォーマットしても問題ありませんが、この比較を行う方法がわかりません。どういうわけか、「日付」の部分もその文字列に変更しますか?

この全体の背後にある考え方は、2013-01-15(または何らかの形式)のような検索を許可することです。これにより、「メモリ」オブジェクトの日付も自動的にチェックされます。

アドバイスをいただければ幸いです。

(それが重要な場合、dbは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 に答える