Единственный способ, которым я могу придумать, чтобы сделать это с помощью Rails-искателей, - это сделать два запроса и вычесть:
class Article
def unused_tags
Tag.all - self.tags
end
end
С другой стороны, вы можете сделать это через SQL (что будет более эффективным, так какбудут только те строки, которые вы хотите ):
query = <<-eos
SELECT *
FROM tags AS t
WHERE NOT EXISTS (
SELECT 1
FROM taggings
WHERE article_id = ?
AND tag_id = t.id
)
eos
Tag.find_by_sql [query, article.id]