7

Railsアプリに全文検索APIを実装しており、これまでThinkingSphinxで大きな成功を収めています。

日付範囲検索を実装して、「範囲の値が正しくありません」というエラーが発生し続けたいと思います。

これがコントローラーコードのスニペットです、そして私は次に何をすべきかについて少し立ち往生しています。

    @search_options = { :page => params[:page], :per_page => params[:per_page]||50 }

    unless params[:since].blank?
        # make sure date is in specified format - YYYY-MM-DD
        d = nil
        begin
            d = DateTime.strptime(params[:since], '%Y-%m-%d')
        rescue
            raise ArgumentError, "Value for since parameter is not a valid date - please use format YYYY-MM-DD"
        end
        @search_options.merge!(:with => {:post_date => d..Time.now.utc})
    end
    logger.info @search_options
    @posts = Post.search(params[:q], @search_options)

ログを見ると、日付がTime.now.utcと同じ時間形式に変換されていないことを意味しているように見えるこのビットが表示されます。

withpost_date2010-05-25T00:00:00+00:00..Tue Jun 01 17:45:13 UTC 2010

何か案は?基本的に、特定の日付以降のすべての投稿を表示するために、「以降」の日付でAPIリクエストを渡そうとしています。日付はYYYY-MM-DD形式にするように指定しています。

ご協力いただきありがとうございます。クリス

編集: 日付パラメータのマージステートメントをこれに変更しました

@ search_options.merge!(:with => {:post_date => d.to_date..DateTime.now})

そして今、私はこのエラーを受け取ります

2010年5月25日火曜日の未定義のメソッド`to_i':日付

ですから明らかに、まだ正しく設定されていないものがあります...

4

3 に答える 3

8

まあ言ってみればd = "2010-12-10"

:post_date => (d.to_time.to_i..Time.now.to_i)あなたをそこに連れて行ったでしょう。私は自分のプロジェクトでこれをやっただけで、うまくいきます

于 2010-12-09T17:53:03.227 に答える
2

私は最終的にこれを解決しましたが、少し異なるアプローチをとっていますが、うまくいきます。

日付範囲検索を sphinx_scope 内 (モデル内) または :condition または :with (コントローラー内) に配置しようとしていました。これは機能しなかったため、代わりにモデルの define_index 内に実装する必要がありました。

そこで、define_index にチェックを入れて、レコードが日付範囲内にあるかどうかを確認しました。日付範囲は、以下に示すように、SQL コードによって定義されています。この場合、「start_date」が現在から 30 日前までの日付内にあるかどうか、「end_date」が今日から 30 日後までの日付内にあるかどうかを確認したかったのです。

日付が範囲内にある場合、以下のコードは、日付範囲の外側または内側にあるかどうかに応じて、:live を 0 または 1 にします (それぞれ)。

define index do
    # fields:
    ...
    # attributes:
    has "CASE WHEN start_date > DATE_ADD(NOW(), INTERVAL -30 DAY) AND end_date < DATE_ADD(NOW(), INTERVAL 30 DAY) THEN 1 ELSE 0 END", :type => :integer, :as => :live
    ...
    # delta:
    ...
end

次に、コントローラーで :live => 1 かどうかを確認して、日付範囲内の start_dates と end_dates を持つすべてのレコードを取得するだけです。

次のように sphinx_scope を使用しました。

sphinx_scope(:live) {
    { :with => { :live => 1 } }
}

そして、私のコントローラーで:

@models = Model.live.search(...)

それがうまく機能することを確認するには、もちろん、インデックスが最新であることを確認するために頻繁な再インデックスを実装する必要があります。つまり、正しいレコードは :live => 1 または 0 です!

とにかく、これはおそらく少し遅いですが、私はそれを実装し、それは魅力のように機能します!!!

于 2010-09-28T16:13:03.203 に答える
-1

交換したらダメかな

d = DateTime.strptime(params[:since], '%Y-%m-%d')

Time.parse(params[:since]).strftime("%Y-%m-%d")

(最初のものは期待される形式で日付を返さないようです)

于 2010-12-09T18:38:05.197 に答える