过去两个月我一直在尝试习惯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
感谢。
答案 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?
方法匹配公共方法和受保护方法。