苦苦于复杂的Rails 3查询(需要:user.friends.checkins)

时间:2010-10-15 02:59:38

标签: ruby-on-rails activerecord ruby-on-rails-3

我正在开发一个社交网络应用程序,正在尝试构建 一个复杂的查询,可以有效地吸引所有用户的朋友 来自数据库的签到。基本上我需要:“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 :(得分:0)

第一个查询应该很好。将索引添加到查询中的外键字段。

答案 1 :(得分:0)

到目前为止我找到的最佳解决方案:

Checkin.joins(:user => :friendships).where('friendships.friend_id' => self.id)