2016-04-05 4 views
1

Я пытаюсь получить книги с объектами ActiveRecord, которые имеют «от» или «до» между диапазоном дат (start_date..end_date).ActiveRecord OR запрос для daterange

Этот код прекрасно работает:

Book.where(from: start_date..end_date) 

Но я хочу использовать «или» в своем заявлении, и этот код не:

Book.where("from: ? OR to: ?", (start_date..end_date), (start_date..end_date)) 

Пожалуйста, помогите мне найти мою ошибку.

+0

с какой ошибкой вы сталкиваетесь? – uzaif

+1

[Может помочь] (http://stackoverflow.com/q/31096009/3444240) – potashin

ответ

1

Вы можете попробовать это -

Book.where("books.from BETWEEN ? AND ? OR books.to BETWEEN ? AND ?", start_date,end_date,start_date,end_date) 
+0

Это почти правильно. Я получаю SELECT 'books'. * FROM' books' WHERE (от BETWEEN '2016-02-01' AND '2016-02-29' OR to BETWEEN '2016-02-01' AND '2016-02-29') , Но небольшая часть по-прежнему отсутствует (должны быть «книги». «From BETWEEN ... AND ...) – Zelenka

+0

Можете ли вы отредактировать свой ответ так или иначе? – Zelenka

+0

@ Зеленка да, обновленный ответ. – dp7

0
if from < to 
    Book.where("from >= #{start_date} OR to <= #{end_date}") 
else 
    // do something else 
end 
+0

'from' должно быть меньше, чем 'end_date' & 'to' должно быть больше, чем 'start_date' тоже, я объяснил это в моем вопросе – Zelenka

+0

, вы можете определить чек, чтобы сделать это –

1

Проверьте Rails guides на условиях Диапазон:

Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight) 

Это даст следующий SQL:

SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AND '2008-12-22 00:00:00') 

Так, приведенные в вы можете использовать or in ActiveRecord in the Rails 5, вы можете сделать

Book.where(from: start_date..end_date).or(Book.where(from: new_start_date..new_end_date)) 

Примечания: Вам не нужно использовать рельсы 5, чтобы использовать этот OR запрос. Мы также можем использовать его с rails 4.2, благодаря драгоценному камню where-or

Смежные вопросы