2014-02-17 2 views
0

Я создаю календарь с поддержкой базы данных в RoR, и первым шагом этого является возвращение всех событий, которые попадают в данный год. Моя таблица событий схема выглядит следующим образом:Выполнение OR и AND с помощью помощников ActiveRecord

id:integer description:string startdate:datetime enddate:datetime 

В английском языке, я думаю, что это логика мне нужно выполнить, чтобы вернуть все события, которые попадают в определенный год:

(при запуске событий меньше году начала И событие конец больше начала года) ИЛИ

(когда начать событие больше, чем года начало И событие конца меньше конца года) ИЛИ

(при запуске события меньше, чем конца года И события конца больше год начала)

Первая строка получает все события, которые заканчиваются в данном Yea r, вторая строка получает все события, которые находятся в течение года, а последняя строка получает все события, которые начинаются в течение года.

Может ли эта логика быть более эффективной?

Я прочитал инструкцию ActiveRecord и создали справедливые несколько динамических сайтов, но я только должен был пойти Person.find(34) или Person.where(name: 'Jimmy') и действительно не знаю, как выполнить вышеупомянутую логику с вспомогательными методами ActiveRecord в!

+0

вы можете сделать это в одном запросе, почему вы используете комбинацию из трех запросов. Вы принадлежите рубину на rails разработчику любой другой технологии? –

+0

У меня мало практики с операторами SQL.Мне было бы интересно посмотреть, как это можно сделать с помощью одного запроса :) – Starkers

ответ

1

написать область в модели

class Event < ActiveRecord::Base 

    scope :event_in_year, lambda { |year| where('(events.startdate < ? AND events.enddate > ?) OR (events.startdate > ? AND events.enddate < ?) OR (events.startdate < ? AND events.enddate > ?)', year.beginning_of_year, year.beginning_of_year, year.beginning_of_year, year.end_of_year, year.end_of_year, year.beginning_of_year)} 
    end 

, а затем использовать эту область, чтобы найти события между любой год, переходя в том же году в этой области

+0

Прохладный, это отвечает на мой вопрос, но как вы думаете, запрос может быть упрощен? – Starkers

+0

off-course yes, ознакомьтесь с этим http://makandracards.com/makandra/984-test-if-two-date-ranges-overlap-in-ruby-or-rails –

+0

, если вы думаете, мой ответ верен, не могли бы вы принять его. –

0

Я думаю, что можно упростить

SELECT DISTINCT id, description FROM calendar 
WHERE enddate >= myyear AND endate <= myyear + 1 
    OR (startdate >= myyear AND startdate <= myyear + 1) 

Первая ИНЕКЕ строка дает все заканчивается в этом году, включая их начала и окончания в этом году, второй дает все, начиная с этого года. С DISTINCT вы получите окончание и начало в том же году только один раз

Для точного синтаксиса баз данных должны быть известной

1

С ActiveRecordwhere методом, вы можете передать string запрос в соответствии с вашими потребностями. Так что-то вроде:

your_string = "events.start_date > ...." 
Model.where(your_string) 
Смежные вопросы