Как найти объекты НЕ в коллекции Has Many Through? - PullRequest
2 голосов
/ 29 сентября 2010

Допустим, в статье есть много тегов с помощью тегов.

Article
   has_many :taggings
   has_many :tags, :though :taggings
end

@article.tags # дает все теги для этой статьи

Как мне найти все теги, которых нет в этой статье?

Спасибо

Ответы [ 2 ]

1 голос
/ 29 сентября 2010

Единственный способ, которым я могу придумать, чтобы сделать это с помощью 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]
0 голосов
/ 30 сентября 2010

Вот что я придумал:

 class Article
    def missing_tags
       Tag.find(:all, :conditions => ['id NOT IN (SELECT taggings.tag_id FROM taggings WHERE (taggings.article_id = ?))', self.id])
    end
 end

@article.missing_tags

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...