我正在寻找一种方法来获取ActiveRecord :: Base的子类(即rails模型类)的所有可用公共方法的列表。在寻找该问题的现有答案之后,我很惊讶自己什么都没发现。我尝试过“ ri ActiveRecord :: Base”,它具有关于模型类的功能以及它们如何工作的一些很好的文档,但是没有实例方法或类方法的列表。当然,我尝试了谷歌搜索,但没有运气。我知道我可以运行一段可以提供此类列表的rails代码(我认为,使用MyModelClass.instance_methods),但这要比仅在命令行上使用ri甚至在在线文档中找到此列表方便得多。 (如果存在,并且显然不存在)。
这样的列表是否可以在任何地方使用(除了通过从源代码中手动提取列表以外)?从目前来看,在我看来并非如此。 (我想这里暗示有要求提供更完整的Rails文档,但是这个主题当然与stackoverflow不相关。)
(edit :)我可能应该提到 我知道自动生成的方法,并且ActiveRecord模型上可用的许多方法都来自ActiveRecord :: Base包含的模块。 (我想避免这个问题过长,但是将其留在外面可能是不明智的。)我想指出的一点是,由于ActiveRecord :: Base提供了一个接口,因此该接口中的方法名称就已经存在(IMO,当然),包括所包含模块中的模块应包含在ActiveRecord :: Base文档中。 (例如,“ ri Array”不是列出来自Enumerable的方法-例如收集和选择吗?)我的观点是,诸如查找包含模块的文档之类的乏味工作应该由我们的计算机和软件来完成,而不是由(以便我们可以将时间花在更重要的工作上,例如开发软件)。无论如何,我的问题的重点是该信息(AR模型方法,例如“ touch”,“ becomes”,“ increment”等)是否可以在一个方便的位置使用。看来答案是否定的。
不过,感谢您的回复。最后,我整理了一个可能有用的简单,简单的脚本-它仅使用ri获取所包含模块的列表,然后在主类和这些模块上运行ri。 (我想我也应该包括扩展模块。)这是脚本,以防万一有人发现它有用:
#!/bin/bash
# Run 'ri' on $1 and all modules included by class $1
class=$1
if [ -z "$class" ]; then exit 0; fi
set $(ri $class|col -b|awk '/Includes:/{go=1} (go && $0 ~ /^ *[A-Z]/) {print} (go && $0 ~ /^ *$/) {exit}')
ri $class|col -b
base=$(echo $class|sed 's@::[^:]*$@@')
for m; do
ri $base::$m|col -b
done