В Rails как найти диссоциированные записи в отношениях HABTM? - PullRequest
1 голос
/ 14 июля 2010

У меня есть отношение HABTM между видео и кампаниями в Rails, что означает, что связь хранится в таблице соединений.Я хочу найти все видео, которые НЕ имеют связанной кампании.Какой самый эффективный способ сделать это?

Спасибо, что посмотрели =)

Ответы [ 3 ]

3 голосов
/ 14 июля 2010
Video.all(:include => :campaigns, :conditions => ["campaigns.id IS ?", nil])

:include выполнит левое соединение со связанной таблицей, поэтому все, что не имеет кампании, должно иметь значения NULL для значений поля кампании.

1 голос
/ 14 июля 2010

Рубиновый путь:

Video.all.select {|v| v.campaigns.empty?}

Я думаю, что это более элегантно, если вы используете его отдельно в методе. Однако я бы порекомендовал написать для этого с именем scope . Опять же, верная версия Джеффса:

named_scope :campaign_less, :include => :campaigns, :conditions => ["campaigns.id IS ?", nil]

Кроме того, решение Джеффса, вероятно, более эффективно, поскольку оно более низкого уровня.

0 голосов
/ 14 июля 2010

Способ SQL:

Videos.select_by_sql("SELECT * FROM videos WHERE id NOT IN (SELECT video_id FROM campaign_videos)")
...