J'ai des sites et des étiquettes dans une relation many to many, reliés par la table de jointure SitesTags :
Site
has_and_belogs_to_many :tags
id name
1 siteA
2 siteB
Tag
# has_and_belogs_to_many :sites
id name
1 tagA
2 tagB
3 tagC
SitesTags
site_id tag_id
1 1
1 2
2 2
2 3
Je voudrais obtenir le nombre de balises que deux sites ont en commun. Dans cet exemple, il y aurait un tag commun au siteA et au siteB (tagB).
Idéalement, je voudrais une solution au niveau des bases de données, mais j'utilise MySQL. J'ai essayé (Site.find(1).tags & Site.find(2).tags).count
mais je peux voir que cela fait des requêtes multiples, et il n'utilise pas COUNT(*) mais récupère toutes les données :
Site Load (0.3ms) SELECT `sites`.* FROM `sites` WHERE `sites`.`id` = 1 LIMIT 1
Site Load (0.3ms) SELECT `sites`.* FROM `sites` WHERE `sites`.`id` = 2 LIMIT 1
Tag Load (0.3ms) SELECT `tags`.* FROM `tags` INNER JOIN `sites_tags` ON `tags`.`id` = `sites_tags`.`tag_id` WHERE `sites_tags`.`site_id` = 1
Tag Load (0.4ms) SELECT `tags`.* FROM `tags` INNER JOIN `sites_tags` ON `tags`.`id` = `sites_tags`.`tag_id` WHERE `sites_tags`.`site_id` = 2
Une autre chose que j'ai essayé est
Site.find(1).tags.where("`sites_tags`.`site_id` = 2")
qui génère
SELECT `tags`.* FROM `tags` INNER JOIN `sites_tags` ON `tags`.`id` = `sites_tags`.`tag_id` WHERE `sites_tags`.`site_id` = 1 AND (`sites_tags`.`site_id` = 2)
Cela ne fonctionne pas, je pense qu'il essaie de trouver un seul enregistrement où le site_id est 1 ET 2.