问题描述
用户
型号:
USER_ID phone_no
------- --------
1 555 - 0001
2 555-0002
。
。
每个用户都有他/她自己的电话号码。
朋友
型号:
USER_ID phone_no
------- --------
用户1 555-0002
用户1 555-0003
用户2 555 - 0001
用户2 555-0004
用户可以有很多的手机号码。电话号码匹配考虑为好友(单向),例如:所有者 555-0003
是一个朋友用户1
,而不是反之。
主题
型号:
topic_id USER_ID称号
-------- ------- -----
1你好
2 1喜
如何优化通过朋友的用户获得最新的10个专题的查询?
我想是这样的:
用户= User.find(2)#任何用户
手机= Friend.all。(:条件=> ['?USER_ID =',user.id] ,:选择=>'phone_no'){地图| x | x.phone_no}
朋友= User.all(:条件=>在('phone_no),手机]){地图| x |。 x.user_id}
主题= Topic.all(:的updated_at DESC条件=>':;;为了=&GT 10,上限=&GT,?在(),朋友USER_ID])
但分手查询时担心性能。如何优化这一ActiveRecord的查询?
类用户
的has_many:主题
的has_many:朋友
的has_many:friend_users,:通过=> :朋友
的has_many:friend_topics,:通过=> :friend_users,:源=> :主题
结束
一流的好友
belongs_to的:用户
belongs_to的:friend_user,:将class_name => 用户,:foreign_key => :电话号码,
:primary_key => :电话号码
结束
一流的主题
belongs_to的:用户
结束
现在给一个用户,你可以得到朋友的主题如下:
current_user.friend_topics.limit(10)
请确保您添加
- 在
phone_no
山坳中的用户的唯一索引
类 - 在
phone_no
山坳中的朋友
类的指标。
User
model:
user_id phone_no
------- --------
1 555-0001
2 555-0002
.
.
Every user has his/her own phone number.
Friend
model:
user_id phone_no
------- --------
user 1 555-0002
user 1 555-0003
user 2 555-0001
user 2 555-0004
User may has many phones numbers. A phone number match is consider as a friend (one direction), e.g. owner of 555-0003
is a friend of user 1
, not vise versa.
Topic
model:
topic_id user_id title
-------- ------- -----
1 1 Hello
2 1 Hi
How to optimize the query of getting the latest 10 topics by friends of a user?
I tried something like:
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')
but worried about performance when breaking up queries. How can I optimize this ActiveRecord query?
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
Now given a user you can get the friend topics as follows:
current_user.friend_topics.limit(10)
Make sure you add
- an unique index on the
phone_no
col in theUser
class - an index on the
phone_no
col in theFriend
class.
这篇关于如何优化此查询的ActiveRecord - 最新的10个专题由朋友的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!