У меня есть 3 модели: Книги, Уведомления и Типы уведомлений. Книги имеют уведомления, так как модель уведомлений имеет book_id. У уведомлений есть один тип уведомления, так как в модели уведомлений есть один идентификатор_идентификации_100 *
Я хочу, чтобы все книги были созданы между датой 1 и датой 2
books_set1 = Book.find :all, :conditions => ["created_at <= ? AND show_time >= ?", max_date, min_date]
Но я не хочу, чтобы в книгах были уведомления о Notification.notification_type_id = 1, и в идеале я хотел бы сказать это, ссылаясь на Notification_type.name, поэтому я не хотел бы, чтобы книги, которые имеют уведомления Notification.notification_type.name = 'type1 «
Если для книги уже создано уведомление типа 1, я не хочу, чтобы оно возвращалось в наборе (поскольку я собираюсь создавать уведомления этого типа с возвращенным набором).
Я не уверен, есть ли способ сделать это в одном запросе, я думаю, что мне нужно 2 запроса и INTERSECT - первый, который я уже включил в этот пост, и второй, в котором я не уверен. Но в псевдокоде я думаю, что это то, что нужно сделать:
notification_type_id = Notification.find_by_name('type1')
get all notifications where notification_id = notification_type_id
set2 = get the associated book set from the notification set (since each notification has one book)
тогда я делаю set1 - set2
UPDATE
Благодаря некоторой помощи я написал два запроса, которые дают мне желаемые результаты. Я хотел бы, чтобы это было в 1 запросе, если кто-нибудь знает, как это сделать:
books_in_range = Book.find :all, :conditions => ["created_at <= ? AND created_at >= ?", max_date, min_date]
books_without_these_notifications = Book.find(:all, :joins => { :notifications => :notification_type }, :conditions => ["notification_types.name = ?","type1"] )
books_to_consider = books_in_range - books_without_these_reminders
Опять же, идея состоит в том, чтобы получить все книги, которые не имеют уведомления о типе 1, созданы и попадают в определенный диапазон дат.