Я недавно застрял на проблеме и нашел свой путь к Арелу, который, похоже, должен позволять мне делать ИЛИ в моих запросах.
В качестве отправной точки мне нужно было преобразовать существующий запрос 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)"
В соответствии с doco на странице 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, однако, когда вы помещаете его в где
Request.where(r.join(a)).to_sql
Я получаю следующее
TypeError: Cannot visit Arel::SelectManager....
Я пытался делать другие действия с Arel в пределах где и это работает (например,)
Request.where(r[:status].eq(nil)).to_sql
=> "SELECT \"requests\".* FROM \"requests\" WHERE (\"requests\".\"status\" IS NULL)"
Это немного за пределами моих знаний о рельсах и рубинах. Есть идеи?
Заранее спасибо.