Предикаты Rails Arel и Active Record - PullRequest
2 голосов
/ 29 июля 2011

Возможно, мне не хватает понимания относительно объектов Arel в Rails.

Вы можете сделать что-то вроде:

u = User.arel_table

then и сумасшедшие добавления запросов, такие как:

u.join(:microposts)

(неявный .on (users [: user_id])).

Но как преобразовать отношение Arel в список объектов Rails?

Обновление

Вот лучший пример.Я только что закончил учебник Майкла Хартла по Rails, где он делает нечто подобное в контроллере Micropost:

  followed_ids  = %(SELECT followed_id FROM relationships WHERE follower_id = :user_id)
  where("user_id in (#{followed_ids}) OR user_id = :user_id", :user_id => user)

Я ненавижу необработанный SQL.Итак, я хочу провести рефакторинг, пока лучшее, что у меня есть, это:

followed_ids  = Relationship.select(:followed_id).where(:follower_id => user) 
where("user_id in (#{followed_ids.to_sql}) OR user_id = :user_id", :user_id => user)

Я использовал для добавления .map (&: follow_id) .join (",") к выбору отношений, который также работает, нотогда у вас есть все идентификаторы в памяти вместо краткого оператора select для обработки БД.

Моя проблема в том, что мне показалось, что мне нужно было сделать .to_sql, чтобы подать туда и сделать его счастливым, когда онесть все, что нужно, чтобы вернуть мне мои предметы.Я думаю о переходе на Squeel, который может хорошо выполнять подзапрос, но я хочу понять Арела.

1 Ответ

5 голосов
/ 29 июля 2011

Ну, вы можете сделать

User.joins(User.arel_table.joins(:microposts))

Но в этом нет особого смысла, поскольку вы можете просто сделать User.joins(:microposts) и получить тот же результат. Но если вам нужно создать более сложные соединения, это может быть удобно.

Нечто подобное может быть полезным, хотя.

User.where(User.arel_table[:name].matches('John%'))

И помните, что хотя вы можете воспользоваться некоторыми из основных вещей Arel в Rails, часто лучше придерживаться более простых методов, таких как .where(:name=>'John') или .where('name LIKE ?', 'John%'), поскольку Rails в любом случае превратит их в объекты Arel за кулисами.

...