2013-11-09 2 views
0

я в настоящее время есть три модели:Rails 4 - отношение habtm с условием по запросу?

  • Метки (HABTM: сообщений)
  • сообщений (HABTM: Теги и имеет много изображений)
  • изображений (принадлежит Сообщение)

Я хочу , tag-controller, получить все сообщения в связи с тегом, который имеет отношение к изображениям.

Любопытное походит:

Tag.posts.where("images").nil? (конечно, не нравится, но я надеюсь, что вы видите, куда я направляюсь)

Прежде, я действительно новичок в Rails, и не выполнял любые условия запроса на моих моделях (только * .all или * .find)

Конечно, я мог бы получить все сообщения, принадлежащие тегу, прокрутить сообщения и удалить те, у которых нет отношения изображения, но это не кажется правильным;)

* EDIT:
Возможно, я был неясен, мне бы хотелось получить все теги (Tags.all()), которые имеют отношение к сообщению, которое имеет отношение к изображению. !
Больше как: Tags.all.posts.images = NULL;) *

ответ

0

Проверка наличия связанной записи легко в SQL, но в Rails для нее нет «легкого» синтаксиса, насколько я знаю. Проблема с простым соединением заключается в том, что сообщение, содержащее n изображений, появится в результирующем наборе n раз - вы можете выполнить отдельный результат, но это становится все менее эффективным с увеличением наборов данных.

Tag.joins(:posts).where("exists (select null from images where images.post_id = posts.id)") 

Аналогично, метки для сообщений без изображения:

Tag.joins(:posts).where("not exists (select null from images where images.post_id = posts.id)") 
+0

Спасибо! Это было действительно близко к тому, что я хочу; Теперь я получаю все теги, у которых есть сообщения с изображениями, но я также получаю сообщения, у которых нет изображений. Как я должен делать только сообщения с изображениями? Loop? Еще раз, спасибо! –

+0

Можете ли вы показать код, по которому вы получаете сообщения? –

+0

Спасибо, что заглянули в это! Я сделал пастебин со всем кодом, таблицами и т. Д. скажите, пожалуйста, если вам нужно больше! http://pastebin.com/35RmzARi –

0

Вы можете сделать это следующим образом:

Tag.joins(posts: :images) 

Это загрузит все теги, которые имеют сообщения, которые имеют изображения.

Смежные вопросы