如何在ActiveRecord中优化此查询 - 朋友最新的10个主题

时间:2012-06-22 06:36:47

标签: ruby-on-rails activerecord

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查询?

1 个答案:

答案 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的索引。