Дата поиска с условием

У меня есть модель, в которой блок определения выглядит так:

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 , как мне это сделать?


person Andrey Delov    schedule 28.04.2011    source источник


Ответы (2)


Похоже на стандартный вызов Active Record SQL. Поскольку вы передаете ему параметры, вы можете выполнить хешированный запрос следующим образом:

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

Отбросьте это в методе, который предоставляет start_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

и у вас есть динамический искатель! :)

person Malefactor    schedule 28.04.2011
comment
Извините, я понял, что вы просто просите одну дату с запросом. Вы бы настроили запрос так же, но использовали бы одну дату для обоих параметров. - person Malefactor; 29.04.2011

Вам понадобятся атрибуты start_date и end_date, а не поля:

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 ко второму диапазону. Настраивайте как вам нужно.

person pat    schedule 30.04.2011
comment
Пэт спасибо за ответ! Но если я сделаю эти поля атрибутами не индексами , я не могу найти дату на них типа 2011-04-13 .. и т.д И еще, если я вместо этого введу 2011-04-13 в sphinx_scope консоль ругается и пишет ошибка ArgumentError: неверное значение для диапазона - person Andrey Delov; 30.04.2011
comment
Sphinx требует реальных объектов Time (или целых чисел, или чисел с плавающей запятой, в зависимости от атрибута) — это не так щадяще, как обычная база данных. Хотя вам нужны эти столбцы как атрибуты для фильтрации, вы также можете использовать их как поля — просто дайте им альтернативные имена: indexes start_date, :as => :start_string. - person pat; 01.05.2011
comment
Пэт, могу ли я использовать стандартную область rails3 в модели для фильтрации результатов без think_sphinx: with ?! я пытаюсь Task.filter.search(''), но подгонщик области не работает! Я спросил, потому что ваш образец не работал :( я вижу ошибку неопределенного метода `at' для Date:Class - person Andrey Delov; 02.05.2011
comment
Области ActiveRecord предназначены для SQL-запросов — они не повлияют на поиск Sphinx. Вам нужно будет использовать области видимости Sphinx, если вам нужен такой синтаксис: фриланс-god.github.com/ts/en/scopes.html - person pat; 04.05.2011