J'ai 3 modèles: Livres, Notifications et Types de Notification. Les livres ont des notifications car le modèle de notification a un book_id. Les notifications ont un NOTIFICATION_TYPE comme le modèle de notification a un notification_type_idSQL noob a besoin d'aide pour écrire une requête Rails impliquant des jointures et peut-être se croiser
Je veux tous les livres créés entre date1 et date2
books_set1 = Book.find :all, :conditions => ["created_at <= ? AND show_time >= ?", max_date, min_date]
Mais je ne veux pas les livres qui ont des notifications de notification.notification_type_id = 1 et idéalement je vous dire ceci en se référant à notification_type.name donc je ne voudrais pas que les livres qui ont des notifications de notification.notification_type.name = « type1 »
S'il y a eu une notification de type1 créé pour un livre déjà, je ne Je veux qu'il revienne dans l'ensemble (parce que je vais c reate les notifications de ce type avec l'ensemble retourné). Je ne suis pas sûr s'il y a un moyen de faire cela en une seule requête, je pense avoir besoin de 2 requêtes avec et INTERSECT - le premier que j'ai déjà inclus dans ce post et le second dont je ne suis pas sûr. Mais en pseudo-code, je pense que c'est ce qu'il doit faire:
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)
alors je ne set1 - set2
MISE À JOUR
Merci à l'aide que j'ai écrit deux requêtes obtenez-moi les résultats souhaités. J'aimerais pour que cela soit dans une requête si quelqu'un sait comment le faire:
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
Encore une fois, l'idée est d'obtenir tous les livres qui n'ont pas de notification de type1 créé et se situent dans une plage de dates .
Avez-vous essayé l'option NOT EXISTS dans ma réponse? Il serait presque certainement plus efficace que d'obtenir tous les livres dans la plage de dates et ensuite obtenir tous ceux avec des notifications de type1. – Shadwell
ça ne marche pas, la notification_id n'est pas définie ... mais je la corrige et je vous tiendrai au courant. Merci de me le rappeler....J'ai raccroché à la réponse de molf – Tony
J'ai modifié pour corriger - l'association était à l'envers entre les livres et les notifications. – Shadwell