Rails SQL Query с поиском - PullRequest
       10

Rails SQL Query с поиском

7 голосов
/ 12 июня 2009

Я хочу, чтобы этот SQL-запрос был написан в контроллере rails с использованием find:

select id,name from questions
where id not in (select question_id from levels_questions where level_id=15)

Как я это сделаю? Я использую Rails Framework и MySQL. Заранее спасибо.

Ответы [ 3 ]

28 голосов
/ 12 июня 2009
Question.find_all_by_sql('select id,name from questions where id not in (select question_id from levels_questions where level_id=15)')

Это по общему признанию не ActiveRecord-ish, но я считаю, что сложные запросы, такие как этот, имеют тенденцию быть МЕНЬШЕ понятными / эффективными при использовании макросов AR. Если у вас уже создан SQL, вы можете использовать его.

Некоторые предложения: инкапсулировать этот вызов find в методе INSIDE класса Question, чтобы скрыть детали из контроллера / представления, и рассмотреть другие конструкции SQL, которые могут быть более эффективными (например, OUTER JOIN, где levels_questions.question_id равен нулю)

21 голосов
/ 12 июня 2009

Простой способ:

ids = LevelsQuestion.all(:select => "question_id", 
        :conditions => "level_id = 15").collect(&:question_id)
Question.all(:select => "id, name", :conditions => ["id not in (?)", ids])

Один выстрел:

Question.all(:select => "id, name",
:conditions => ["id not in (select question_id from levels_questions where level_id=15)"])
3 голосов
/ 07 марта 2012

И рельсы 3 пути:

ids = LevelsQuestion.select(:question_id).where(:level_id => 15).collect(&:question_id)
Question.select(:id, :name).where("id not in (?)", ids)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...