комплексное объединение в области Rails ActiveRecord - PullRequest
4 голосов
/ 03 апреля 2012

У меня есть следующий объем, который я знаю, не является оптимальным:

scope :event_stream_for, lambda{ |user|
  where("target_id in (?) and target_type = ?", user.events.collect(&:id), "Event")
}

Это создает 3 запроса. Как я могу оптимизировать это?

В качестве альтернативы, как поместить весь SQL-оператор в лямбду области видимости, например

SELECT * FROM activities WHERE target_type =='Event' AND target_id IN (SELECT DISTINCT id FROM events WHERE (host_id == user.id OR invitee_id == user.id))

Спасибо

Ответы [ 2 ]

4 голосов
/ 03 апреля 2012

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

scope :event_stream_for, lambda{ |user
  joins(:events). # or joins("LEFT JOIN events ON events.user_id = users.id").
  where(["target_type=?", "Event"]) 
}

это запустит один запрос.Не проверял мой код с вашей таблицей, но он должен работать аналогично.

----------------------- на основании вашего отредактированного вопроса-------------------

SELECT * ИЗ действий WHERE target_type == 'Event' И target_id IN (SELECT DISTINCT id ИЗ событий WHERE (host_id ==user.id ИЛИ пригласить_ид == user.id))

Это все о ActiveRecord Relation, http://railscasts.com/episodes/239-activerecord-relation-walkthrough?view=asciicast

Activity.
select("*,distinct events.id AS events_id").
joins("events ON (events.host_id = #{user.id} OR events.invitee_id = #{user.id}").
where(:target_type => 'Event')

Попробуйте это на консоли, и если это работает, вы можете просто изменитьэто к объему.Поскольку я не уверен в том, что вы пытаетесь сделать, вам может потребоваться некоторая корректировка.

1 голос
/ 04 апреля 2012

Как насчет этого?

scope :event_stream_for, lambda{ |user|
  where("target_id in (SELECT DISTINCT id FROM events WHERE (host_id == ? OR invitee_id == ?) and target_type = ?", user.id, user.id, "Event")
}

Это просто переставляет то, что у вас уже было, но должно привести вас к одному запросу, поскольку он не использует ассоциации в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...