Попытка создать сложный AR-запрос, включающий ассоциации

У меня есть модель Story с атрибутом :category. Story также находится в отношениях HABTM с Tag.

class Tag < ActiveRecord::Base

    has_and_belongs_to_many :stories, :uniq => true

    validates   :name,   :presence => true
    validates   :creator_id,  :presence => true

end

class Story < ActiveRecord::Base

  attr_accessible :title, :category

  belongs_to    :user
  has_and_belongs_to_many :tags, :uniq => true
end

Я хочу искать истории, которые либо (i) имеют категорию в переданном массиве category_array, либо (ii) имеют связанное имя тега, которое находится в переданном массиве тегов.

Первая часть прямолинейна:

Story.where(:category => category_array)

Это вторая часть, которая расширяет мои возможности. Любая помощь будет принята с благодарностью!

ОБНОВЛЕНИЕ

Это решает проблему и довольно легко читается, но лучший ли это подход? Кстати, я думал об использовании arel, но я до сих пор не понимаю, как я буду использовать arel в таблице соединений:

Story.includes(:tags).where("tags.name in (tag_array) OR category in (cat_array)")

person chuck w    schedule 05.04.2013    source источник
comment
Уже ответили здесь stackoverflow .com/questions/3291152/ и здесь stackoverflow.com/questions/3684311/   -  person manoj    schedule 05.04.2013
comment
Ничего себе, @manoj, это несколько противоречивых ответов (принятый ответ на один из ваших указателей говорит, что arel не поддерживает ИЛИ, в то время как самый популярный ответ на другой указатель говорит, что поддерживает). Ни один из комментариев к любому ответу, кажется, не согласен с лучшим способом продолжить. Кстати, я обнаружил, что arel поддерживает ИЛИ. Но все же я не уверен, как использовать arel в таблице соединений. Я обновляю свой вопрос, чтобы дать больше информации.   -  person chuck w    schedule 05.04.2013
comment
как говорится в комментариях в ссылках, «или» - это недавнее дополнение к ARel, поэтому принятый ответ, вероятно, был написан до того, как он был реализован, а самый популярный - после.   -  person MrTheWalrus    schedule 05.04.2013
comment
Первая ссылка говорит, что "или" не поддерживается. Вопрос по второй ссылке написан спустя пару месяцев, но два самых популярных ответа на вопрос прямо противоречат друг другу. Один говорит, что «или» поддерживается, а другой говорит, что это не так. Таким образом, указание на эти вопросы как на ответ без объяснения противоречия не помогает сообществу SO.   -  person chuck w    schedule 06.04.2013


Ответы (1)


Это решает проблему и довольно легко читается, но лучший ли это подход?

Story.includes(:tags).where("tags.name in (tag_array) OR category in (cat_array)")
person chuck w    schedule 17.04.2013