模型如何响应方法:find?

时间:2015-11-07 12:19:52

标签: ruby-on-rails ruby

过去两个月我一直在尝试习惯Rails和Ruby,我有一个小问题困在我的脑海中,以便能够更清楚地看到更大的图片。

假设我有一个名为播放列表的模型,我的数据库中已经有一些条目:

class Playlist < ActiveRecord::Base
end

据我所知,我们可以通过以下方式访问一个模型实例,该模型实例应与原始数据库相对应:

p = Playlist.find(2)

首先,结果“p”是模型播放列表的一个实例,对吧?其次,我试图了解“:find”方法的实现位置或模型如何响应它。它是我的模型的类方法还是ActiveRecord :: Base的类方法?因为我无法在下面的任何输出中列出“:find”。

puts p.class.methods(false).sort
puts p.class.superclass.methods(false).sort
puts p.class.superclass.superclass.methods(false).sort

感谢。

2 个答案:

答案 0 :(得分:0)

它是继承自ActiveRecord :: Base的播放列表的类方法。

尝试:

ActiveRecord::Base.methods

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation/finder_methods.rb

答案 1 :(得分:0)

尝试此操作以获取包含:find方法的类和/或模块:

x = Playlist.ancestors
arr = []
m = :find

x.each{ |i| arr << i if i.method_defined?(m) }

puts "The following Classes and/or Modules contain the :#{m.to_s} method:"
puts arr

第一个打印结果是方法m所在的位置。下面的结果列出了修改前包含“原始”方法的祖先类和/或模块(按顺序)(尽管它们可能包含完全使用相同方法名称的不同方法)。如果您想进一步研究相关方法,这可能会派上用场。

N.B。仅使用method_defined?方法匹配公共方法和受保护方法。