本文介绍了如何优化此查询的ActiveRecord - 最新的10个专题由朋友的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

用户型号:

  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 the User class
  • an index on the phone_no col in the Friend class.

这篇关于如何优化此查询的ActiveRecord - 最新的10个专题由朋友的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 12:50