Как указать этот запрос с помощью Squeel?

Предположим, у меня есть модель:

class Question < ActiveRecord::Base   
   attr_accessible :title  # it has title attribute   
   has_many :pictures 
end

Я хочу определить запрос scope с именем completed, который:

Возвращает все вопросы, чьи:

  • заголовок не пустой ИЛИ
  • есть хотя бы 1 картинка

Как я могу это сделать?

Пока что у меня есть:

class Question < ActiveRecord::Base   
   attr_accessible :title  # it has title attribute   
   has_many :pictures 

   scope :completed, where{title != ""}  # returns all questions with non-empty title
end

Было бы неплохо, если бы я мог просто сказать:

class Question < ActiveRecord::Base   
   attr_accessible :title  # it has title attribute   
   has_many :pictures 

   scope :completed, where{title != "" || pictures.count > 0}
end

person sivabudh    schedule 15.07.2011    source источник


Ответы (1)


Конечно, вы можете сделать это с Squeel! Просто напишите свой объем следующим образом:

scope :completed, joins{pictures.outer}.where{(title != "") | (pictures.id != nil)}.group{id}

Надеюсь, я помог.

person Gerry    schedule 19.07.2011
comment
Будет ли этот запрос возвращать мне все вопросы, которые либо имеют 1) заголовок или 2) по крайней мере 1 изображение? Или в этом запросе говорится, что возвращаются вопросы с заголовком и хотя бы с одним изображением? - person sivabudh; 22.07.2011
comment
Я ищу запрос, который сделает первый. То есть вопросы, у которых либо есть заголовок, либо или хотя бы картинка. - person sivabudh; 22.07.2011
comment
извините за то, что я неправильно понял вопрос. Вам нужно внешнее соединение. Я выложил правильный писк сейчас :)! - person Gerry; 22.07.2011
comment
Спасибо! Кстати, а зачем в конце вызывать группу? - person sivabudh; 23.07.2011
comment
Это связано с тем, что в вопросе много изображений, а с помощью группы в конце вы обеспечиваете отсутствие дублирования строк вопроса! - person Gerry; 23.07.2011