ステータスのテーブルがあり、それぞれに name 属性があります。現在、私はできる:
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 を連携させるためのアイデアはありますか?