0

Ruby on Railsでソーシャルネットワーキングアプリを作成していますが、Micropostモデルのようにwhereメソッドとclassメソッドを使用すると、興味深い動作が見られました。これは、前のクラスを指定しなくても機能します(「Micropost.where」など)。 () ")

    class Micropost < ActiveRecord::Base
      attr_accessible :content
      belongs_to :user

      validates :user_id, presence: true
      validates :content, presence: true, length: { maximum: 255 }

      default_scope order: "microposts.created_at DESC"

      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

ただし、以下のようなインスタンスメソッドで使用する場合は、モデルの名前を知っている必要があります。

    class User < ActiveRecord::Base
      ...
      ...
      def friends()
        sql_direct_friends   = "SELECT friend_id FROM friendships
                                WHERE approved = :true_value AND user_id = :user_id"
        sql_indirect_friends = "SELECT user_id FROM friendships
                                WHERE approved = :true_value AND friend_id = :user_id"                       
        User.where("id IN (#{sql_direct_friends}) OR id IN (#{sql_indirect_friends})", user_id: id, true_value: true)
      end  
    end

次に、「User.where」の代わりに「where」を使用すると、次のようなエラーが発生します。

  NoMethodError: undefined method `where' for #<User:0x00000004b908f8>

なぜそれが起こっているのですか?friends()メソッド内のwhereメソッドは、現在のオブジェクト(self.friends())のインスタンスメソッドとして使用していると見なしますか?

4

2 に答える 2

3

はい。インスタンスメソッド内でwhere、Userオブジェクトに送信されています。ただし、に応答する方法を知っているのはUserクラスwhereだけです。

于 2013-01-13T18:47:11.763 に答える
0

Ruby では、メソッド呼び出しは常に現在の に送信されselfます。selfメソッド内を印刷して、表示される内容を確認することもできます。

self内のクラスになり、内def self.from_users_followed_byのクラスのインスタンスになりますdef friends

メッセージ 'where' (Ruby では、メソッドを呼び出すことは、実際にはオブジェクトにメッセージを送信することを意味します) がメソッド内の によって認識されないことは驚くことではありませselffriends()

于 2013-01-15T01:57:34.893 に答える