Led*_*ddo 7 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)
Run Code Online (Sandbox Code Playgroud)
当我查看日志时,我看到这一点似乎暗示日期尚未转换为与Time.now.utc相同的时间格式.
withpost_date2010-05-25T00:00:00+00:00..Tue Jun 01 17:45:13 UTC 2010
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?基本上我试图让API请求在"自"日期传递,以查看特定日期之后的所有帖子.我指定日期应该是YYYY-MM-DD格式.
谢谢你的帮助.克里斯
编辑: 我刚刚将日期参数merge语句更改为此
@ search_options.merge!(:with => {:post_date => d.to_date..DateTime.now})
现在我收到了这个错误
2010年5月25日星期二的未定义方法`to_i':日期
显然有一些东西还没有正确设置......
我们说吧 d = "2010-12-10"
:post_date => (d.to_time.to_i..Time.now.to_i)会让你到那儿 我刚刚在我的项目中做到了这一点并且效果很好
小智 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!
不管怎样,这对你来说可能有点晚了,但我实现了它,它的效果就像一个魅力!
| 归档时间: |
|
| 查看次数: |
2474 次 |
| 最近记录: |