我有一个状态表,每个状态都有一个名称属性。目前我可以这样做:
FooStatus.find_by_name("bar")
这很好。但我想知道我是否可以这样做:
FooStatus.bar
所以我有这种方法:
class FooStatus < ActiveRecord::Base
def self.method_missing(meth, *args, &block)
if self.allowed_statuses.include?(meth.to_s.titleize)
self.where("name = ?", meth.to_s.titleize).first
else
super(meth, *args, &block)
end
end
def self.allowed_statuses
self.pluck(:name)
end
end
上面的代码有效,但会导致以下奇怪的行为:
FooStatus.respond_to?(:bar) => false
FooStatus.bar => #<FooStatus name: 'bar'>
这不是很好,但是如果我尝试实现 respond_to?,我会遇到递归问题
class FooStatus < ActiveRecord::Base
def self.method_missing(meth, *args, &block)
if self.allowed_statuses.include?(meth.to_s.titleize)
self.where("name = ?", meth.to_s.titleize).first
else
super(meth, *args, &block)
end
end
def self.allowed_statuses
self.pluck(:name)
end
def self.respond_to?(meth, include_private = false)
if self.allowed_statuses.include?(meth.to_s.titleize)
true
else
super(meth)
end
end
end
这让我:
FooStatus.bar => ThreadError: deadlock; recursive locking
关于让 method_missing 和 respond_to 一起工作的任何想法?