User
型号:
user_id phone_no
------- --------
1 555-0001
2 555-0002
.
.
每个用户都有自己的电话号码。
Friend
型号:
user_id phone_no
------- --------
user 1 555-0002
user 1 555-0003
user 2 555-0001
user 2 555-0004
用户可能拥有多个电话号码。电话号码匹配被视为朋友(一个方向),例如, 555-0003
的所有者是user 1
的朋友,反之亦然。
Topic
型号:
topic_id user_id title
-------- ------- -----
1 1 Hello
2 1 Hi
如何优化用户朋友获取最新10个主题的查询?
我尝试过类似的事情:
user = User.find(2) # any user
phones = Friend.all(:conditions=>['user_id = ?',user.id],:select=>'phone_no').map {|x| x.phone_no}
friends = User.all(:conditions=>['phone_no in (?), phones]).map {|x| x.user_id}
topics = Topic.all(:conditions=>['user_id in (?), friends], :limit => 10, :order => 'updated_at DESC')
但在分解查询时担心性能。如何优化此ActiveRecord查询?
答案 0 :(得分:2)
class User
has_many :topics
has_many :friends
has_many :friend_users, :through => :friends
has_many :friend_topics, :through => :friend_users, :source => :topics
end
class Friend
belongs_to :user
belongs_to :friend_user, :class_name => "User", :foreign_key => :phone_no,
:primary_key => :phone_no
end
class Topic
belongs_to :user
end
现在,如果有用户,您可以按如下方式获取朋友主题:
current_user.friend_topics.limit(10)
确保添加
phone_no
类User
列的唯一索引
phone_no
类中Friend
col的索引。