2011-04-28 75 views
0

我有一个模型,其中定义块的样子:搜索日期与条件

define_index do 
    indexes title, content, manager, note, start_date, end_date 

    has created_at, updated_at 

    has user_id, :as => :user_id, :type => :integer 

    set_property :delta => true 
end 

我要搜索按日期的任务,这可能会落入start_date..end_date之间的差距,我该怎么办这个 ?

回答

0

看起来像一个标准的活动记录SQL调用。既然你传递给它的参数,你可以做一个散列查询,像这样:

tasks = Task.where("start_date > :start_date and end_date < :end_date", {:start_date => start_date, :end_date => end_date}) 

下降,在供应起始日期日期和结束日期,像这样的方法:

def tasks_within_range(start_date, end_date) 
    Task.where("start_date > :start_date and end_date < :end_date {:start_date => start_date, :end_date => end_date}) 
end 

,你已经有了一个动态取景器! :)

+0

对不起,我意识到你只是要求查询一个日期。您可以将查询设置为相同,但为这两个参数使用单个日期。 – Malefactor 2011-04-29 02:16:34

0

你会希望有起始日期日期和结束日期为属性,而不是字段:

define_index do 
    indexes title, content, manager, note 

    has created_at, updated_at, start_date, end_date 
    has user_id, :as => :user_id, :type => :integer 

    set_property :delta => true 
end 

然后,您将使用范围限制在这两个属性的结果:

today = Date.today.to_time # or whatever you like 
Task.search :with => { 
    :start_date => (Time.at(0)..date), 
    :end_Date => (date..Time.at(2 ** 32)) 
} 

应该完成这项工作 - 或者在第二个范围内添加一个+ 1.day。根据需要调整。

+0

帕特感谢您的回答!但如果我让这些字段属性不索引,我找不到他们的日期类型2011-04-13 ..等 然而,如果我反而进入sphinx_scope控制台发誓2011年4月13日发誓并写入错误 ArgumentError:范围的值不正确 – 2011-04-30 06:55:36

+0

Sphinx需要实际的Time对象(或整数或浮点数,取决于属性) - 它不像普通数据库那样宽容。虽然您需要这些列作为过滤的属性,但您也可以将它们作为字段使用 - 只需给它们替代名称:'索引start_date,:as =>:start_string'。 – pat 2011-05-01 00:36:45

+0

帕特我可以在模型中使用标准rails3“范围”,结果过滤没有思考_sphinx:与?!我尝试Task.filter.search(''),但范围fitler不工作!我问,因为你的示例没有工作:(我看到错误未定义的方法'在'日期:类 – 2011-05-02 15:22:30