Борьба со сложным запросом Rails 3 (нужно: user.friends.checkins) - PullRequest
1 голос
/ 15 октября 2010

Я работаю над приложением для социальных сетей и пытаюсь создать сложный запрос, который эффективно вытягивает всех друзей пользователя Чекины из базы данных. В основном мне нужно: "user.friends.checkins"

Я воссоздал (в упрощенном виде) структуру данных ниже для ссылки и включены несколько решений, которые я нашел, однако я чувствую, как мои решения неоптимальные. Я надеюсь, что кто-то может указать лучший путь ... Итак, вот так:

Сначала я попробовал, это работает, но это слишком медленно, учитывая, что пользователи обычно у каждого +1000 друзей:

=> Checkin.where(:user_id => self.friends)

Тогда я попробовал это, которое также работает и намного быстрее, но чувствует неаккуратно:

=> Checkin.joins(:user).joins('INNER JOIN "friendships" ON
"users"."id" = "friendships"."friend_id"').where(:friendships =>
{:user_id => 1})

Буду признателен за любую помощь, которую вы можете оказать! Спасибо в заранее !!!

=== Структура данных ===

Users table has columns: id, name
Friendships table has columns: user_id, friend_id
Checkins table has columns: id, location, user_id

=== Модели ===

class User
 has_many :friendships
 has_many :friends, :through => :friendships
 has_many :checkins
end

class Friendship
 belongs_to :user
 belongs_to :friend, :class_name => 'User'
end

class Checkin
 belongs_to :user
end

Ответы [ 2 ]

0 голосов
/ 15 октября 2010

Лучшее решение, которое я нашел до сих пор:

Checkin.joins(:user => :friendships).where('friendships.friend_id' => self.id)
0 голосов
/ 15 октября 2010

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

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