我正在使用Ruby on Rails创建一个社交网络应用程序,当我在Micropost模型中使用where方法和类方法时,我看到了一个有趣的行为,它在没有指定前面的类的情况下工作(类似“ 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
然后如果我使用“where”而不是“User.where”那么我会收到这样的错误:
NoMethodError: undefined method `where' for #<User:0x00000004b908f8>
为什么会这样? friends()方法中的where方法是否认为我将它用作当前对象的实例方法(self.friends())?
答案 0 :(得分:3)
是。在实例方法中,where
被发送到User对象;但是,只有用户类知道如何回复where
。
答案 1 :(得分:0)
在Ruby方法中,调用始终发送到当前self
。
您甚至可以在方法中打印self
并查看它将显示的内容。
self
将是def self.from_users_followed_by
内的一个类,它将是def friends
内的一个类的实例。
毫无疑问,self
方法中的friends()
无法识别消息'where'(在Ruby中调用方法实际上意味着向对象发送消息)。