J'essaie de réaliser ce que je pense sera une requête assez complexe en utilisant la magie de Rails sans avoir beaucoup de SQL laide dans le code.named_scope dans les rails avec une association has_many
Puisque ma base de données traite de modèles biomédicaux plutôt spécialisés, je vais traduire ce qui suit en un scénario plus réaliste.
J'ai un livre de modèle qui
has_many: chapitres
et chapitre qui
belongs_to: livre
Say pour les chapitres d'instance ont un attribut de nom et les noms peuvent être préface, introduction et annexe, et un livre pourrait avoir un chapitre nommé préface et un chapitre nommé introduction mais pas de chapitre nommé annexe. En fait n'importe quelle combinaison de ces
Je cherche à trouver tous les livres qui ont les deux chapitres nommés préface et introduction.
À l'heure actuelle j'ai un named_scope comme suit
Book
named_scope :has_chapter?, lambda { |chapter_names|
condition_string_array = []
chapter_names.size.times{condition_string_array << "chapters.name = ?"}
condition_string = condition_string_array.join(" OR ")
{:joins => [:chapters] , :conditions => [condition_string, * chapter_names]}
}
Si j'appelle livre. has_chapter? ["préface", "introduction"] cela me trouvera tous les livres qui ont soit un chapitre intitulé préface ou introduction. Comment pourrais-je faire une chose similaire qui me trouverait isoler que les deux chapitres préface et introduction? Je ne suis pas très familier avec SQL donc je ne suis pas sûr du type de jointure qui serait nécessaire et si cela pourrait être réalisé dans une portée nommée.
Un grand merci
Anthony
Cela fonctionne très bien, si un peu lentement. Ajout de quelques indices aidés. – Anthony
+1 exactement ce que je cherchais, merci! – MiniQuark
Oui, PostgreSQL supporte les sous-requêtes. Il est supporté bien avant MySQL, donc ça marche aussi. –