2013-02-11 3 views
0

У меня возникли проблемы, обворачивающие мою голову, используя .joins в нескольких ассоциациях. Это моя установка модели:Рельсы нескольких соединений возвращают пустой набор. Зачем?

class Article 
    has_many :comments 
    has_many :tags 
end 

class Comment 
    belongs_to :article 
end 

class Tag 
    belongs_to :article 
end 

Я пытаюсь найти все статьи с комментарием, который имеет конкретный комментарий орган или тег с определенным текстом тега. Это мой вопрос:

Article.joins(:tags, :comments).where("(\"tags\".\"tag\" = 'awesome') OR (\"comments\".\"body\" = 'hello') 

Это всегда возвращает пустой результат. Странное дело, что это будет работать:

Article.joins(:tags).where(:tags => {:tag => "awesome:}) 

Но когда я добавляю другой присоединяется символ, ничего не возвращается:

Article.joins([:tags, :comments]).where(:tags => {:tag => "awesome"})

Есть ли в этом смысл? Я что-то делаю глупо?

+0

Это тот случай, когда некоторые из помеченных статей могут не иметь комментариев (или, наоборот, некоторые из комментариев статей не могут иметь никаких тегов)? –

ответ

6

joins с аргументом массива или символа в Rails всегда делает INNER JOIN в sql, даже при соединении нескольких таблиц.

Итак, если у вас нет статей с тегами и комментариями (или те статьи, которые имеют как теги, так и комментарии, не соответствуют вашему условию), вы получите пустой результат, потому что вы только сопоставляете эти условия с поперечным сечением статей, имеющих как комментарии , так и теги.

Чтобы получить действительно все статьи с тегами и комментариями, сделать LEFT JOIN сами

Article.joins("LEFT JOIN tags ON tags.article_id = articles.id 
       LEFT JOIN comments ON comments.article_id = articles.id") 

И затем применить свое состояние.

+0

Отлично. Только то, что мне нужно! – Ronze

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