Arel, Joins and Rails Queries

Недавно я на некоторое время застрял в проблеме и нашел свой путь к Arel, который, похоже, должен позволить мне выполнять ИЛИ в моих запросах.

В качестве отправной точки мне нужно было преобразовать существующий запрос Rails 3 в Arel, и здесь я столкнулся с проблемами.

Следующая область и запрос работают так, как я ожидал. Он выдает мне запросы, связанные с рекламой определенного пользователя.

#in the Request class
scope :responder, lambda { |user| joins(:ad).where(:ads => { :user_id => user }) }

Request.responder(303).to_sql

=> "SELECT \"requests\".* FROM \"requests\" INNER JOIN \"ads\" ON \"ads\".\"id\" = \"requests\".\"ad_id\" WHERE (\"ads\".\"user_id\" = 303)"

Согласно документу на странице Arel github и Railscast 215, я должен иметь возможность сделать что-то вроде следующего, чтобы воспроизвести запрос с помощью Arel

  requests = Request.arel_table
  ads = Ad.arel_table
  where(requests.join(ads).on(ads[:id].eq(requests[:ad_id])))

Это приводит к ошибке

TypeError: Cannot visit Arel::SelectManager

Я могу сделать следующее в консоли

r = Request.arel_table
a = Ad.arel_table

r.join(a).to_sql
 => "SELECT  FROM \"requests\" INNER JOIN \"ads\" "

Таким образом, похоже, что он формирует запрос SQL, однако, когда вы помещаете его в where

Request.where(r.join(a)).to_sql

, я получаю следующее

TypeError: Cannot visit Arel::SelectManager....

I ' Я пробовал выполнять другие действия с Arel внутри where, и это работает (например)

Request.where(r[:status].eq(nil)).to_sql
 => "SELECT \"requests\".* FROM \"requests\" WHERE (\"requests\".\"status\" IS NULL)"

Это немного выходит за рамки моих растущих знаний rails / ruby. Есть идеи?

Заранее спасибо.

15
задан Veger 26 December 2011 в 15:42
поделиться