思考狮身人面像与日期范围

时间:2010-06-01 18:05:53

标签: ruby-on-rails thinking-sphinx

我正在为我的rails应用程序实现全文搜索API,到目前为止,Thinking Sphinx取得了巨大的成功。

我现在想要实现日期范围搜索,并继续获得“范围错误值”错误。

以下是控制器代码的片段,我对下一步该做什么感到困惑。

    @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格式。

感谢您的帮助。 克里斯

编辑:我刚刚将日期参数merge语句更改为此

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

现在我收到此错误

2010年5月25日星期二的未定义方法`to_i':日期

显然有些东西还没有正确设置......

3 个答案:

答案 0 :(得分:8)

让我们说d = "2010-12-10"

:post_date => (d.to_time.to_i..Time.now.to_i)会让你在那里。我刚刚在我的项目中做到了这一点并且效果很好

答案 1 :(得分: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 =&gt; 1获取在日期范围内具有start_dates和end_dates的所有记录。

我使用了像这样的sphinx_scope:

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

然后在我的控制器中:

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

为了确保它运行良好,您当然需要实施频繁的重建索引以确保索引是最新的,即正确的记录是:live =&gt; 1或0!

无论如何,现在对你来说可能有点晚了,但是我实现了它,就像魅力一样!

答案 2 :(得分:-1)

如果你更换了

,它会不会起作用
d = DateTime.strptime(params[:since], '%Y-%m-%d')

通过

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

(似乎第一个没有以预期格式返回日期)