0

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 クエリを最適化するにはどうすればよいですか?

4

1 に答える 1

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
于 2012-06-22T07:09:28.727 に答える