0

Railsチュートリアル第2版の第11章のリスト11.45では、クラスのfrom_users_followed_byクラスメソッドはMicropost次のように定義されています。

class Micropost < ActiveRecord::Base
...
  def self.from_users_followed_by(user)
    followed_user_ids = "SELECT followed_id FROM relationships
                         WHERE follower_id = :user_id"
    where("user_id IN (#{followed_user_ids}) OR user_id = :user_id", 
          user_id: user.id)
  end
end

この章の脚注13には、このブログ投稿へのリンクがあり、副選択文字列を作成する場合construct_finder_sqlは、メソッドでActiveRecord内部メソッドを使用できると述べています。そこで、文字列を次sendのように置き換えようとしました。followed_user_ids

followed_user_ids = Relationship.send(:construct_finder_sql,
                                      select: "followed_id",
                                      conditions: { follower_id: :user_id })

唯一の問題は、それconstruct_finder_sqlがRails 3で減価償却されたということです。そのため、私が書いたものがまったく正しいかどうかわからないだけでなく、とにかくそれを使用することはできません。:user_idそれで、この状況で機能するActiveRecord(できればパラメーターを使用できる)を使用して副選択文字列を作成するRails 3の方法はありますか?

4

1 に答える 1

1

seb-select を別のクエリとして作成しto_sql、SQL を取得するために使用できます。

def self.from_users_followed_by(user)
  followed = Relationship.select(:followed_id)
                         .where(:follower_id => user.id)
                         .to_sql
  where("user_id in (#{followed}) or user_id = :user_id", :user_id => user.id)
end

M.select(...).where(...)インスタンスを構築するだけのようなものActiveRecord::Relationや、クエリを少しずつ構築するものなど、(何らかの方法で) 結果を要求するまでデータベースには何も送信されません。したがって、AREL を使用してクエリを作成し、to_sqlそれを使用して SQL バージョンを取得できます。

于 2012-06-10T18:20:49.530 に答える