現在、Ruby on Rails チュートリアルのソースコードをgithubからダウンロードして、勉強のために閲覧しています。 Twitterのようにつぶやいたことを表示するアプリです。
下記のself.from_users_followed_by
は引数に受け取ったuserがフォローしているユーザーがフォローしているユーザーの投稿を取得するものです。
ruby
1class Micropost < ActiveRecord::Base 2 def self.from_users_followed_by(user) 3 followed_user_ids = user.followed_user_ids 4 where("user_id IN (?) OR user_id = ?", followed_user_ids, user) 5 end 6end
このメソッドだとフォローしているユーザーが5000人以上だとスケールアップができないため、次のようにサブセレクトを使い対応すると書いてありました。
ruby
1class Micropost < ActiveRecord::Base 2 def self.from_users_followed_by(user) 3 followed_user_ids = "SELECT followed_id FROM relationships 4 WHERE follower_id = :user_id" 5 where("user_id IN (#{followed_user_ids}) OR user_id = :user_id", 6 user_id: user.id) 7 end 8end
もとのfollowed_user_ids = user.followed_user_ids
の方法だと、全てのフォローしているユーザーidの配列がrubyのメモリの中に配置されてしまうのが問題なのでしょうか?それがサブセレクトを使うと、ruby側の余分なメモリ確保を防ぐことができると思いました。しかし、サブセレクトでもidを取得した際にメモリ確保はされると思います。
followed_user_ids = user.followed_user_ids
の問題は上記の解釈で合っていますでしょうか?
ご回答、よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/17 06:08
2015/08/17 06:13
2015/08/18 02:10
2015/08/18 02:31
2015/08/18 04:34
2015/08/18 05:13
2015/08/19 04:57