Sye*_*Ali 15 ruby ruby-on-rails
我有两个型号,
User
Membership
Run Code Online (Sandbox Code Playgroud)
两者之间有以下关系
user has_many :memberships
Run Code Online (Sandbox Code Playgroud)
我一直试图找出构建方法所在的位置,以及如何在实例的方法列表中获取它.这是显示我的delima的调试器的输出
(rdb:63) @user.memberships.respond_to?"build"
true
Run Code Online (Sandbox Code Playgroud)
虽然以下是返回false,但它不会返回true?
(rdb:63) @user.memberships.instance_methods.include?"build"
false
Run Code Online (Sandbox Code Playgroud)
一点是instance_methods
采用可选的布尔参数,指示是否要查看实例祖先的方法.在你的情况下,我认为你想要instance_methods(true)
.
但是,根据文档,似乎"构建"是一种自动生成的方法.通常,ActiveRecord中的自动生成方法是通过覆盖method_missing
和处理对实际不存在的"方法"的调用来实现的. responds_to
也被覆盖,以便类表明它响应正确的调用.但是,由于这些"方法"实际上并未定义,因此它们不会显示在instance_methods
列表中.
由于类可以respond_to
使用的命令列表method_missing
基本上是无限的,我很确定没有办法获取列表.例如,具有一个ActiveRecord模型属性的a,b,c和d将自动将呼叫诸如响应find_by_a_and_b
和find_by_a_b_and_c
和find_by_b_and_d
等等,循环往复.没有办法得到所有这些可能性的清单.
你可以尝试:
@user = User.first
@user.methods.grep /method_name/
Run Code Online (Sandbox Code Playgroud)
但是,我不认为你会在列表中看到'build'或'create'.这些方法很可能是动态生成的
请注意,instance_methods
根据Ruby版本返回String或Symbol数组.
Ruby 1.8返回一个String数组,Ruby 1.9返回一个Symbol数组.
在Ruby 1.8中
"".respond_to?(:upcase)
# => true
"".class.instance_methods.include?("upcase")
# => false
"".class.instance_methods.include?(:upcase)
# => false
Run Code Online (Sandbox Code Playgroud)
在Ruby 1.9中
"".respond_to?(:upcase)
# => true
"".class.instance_methods.include?("upcase")
# => false
"".class.instance_methods.include?(:upcase)
# => true
Run Code Online (Sandbox Code Playgroud)
此外,instance_methods
必须在类上调用,而不是在实例上调用.
归档时间: |
|
查看次数: |
16624 次 |
最近记录: |