Во-первых, я бы изменил то, что у вас уже есть.
Если вы перехватываете его методом method_missing, вы можете избежать жесткого кодирования списка категорий.
class ActivityCategory < ActiveRecord::Base
has_many :activities
alias_method :old_method_missing, :method_missing
def self.method_missing(method, *args, &block)
if cat = self.class.find_by_name(method.to_s)
return cat
else
old_method_missing(method, *args, &block)
end
end
end
Это работает, потому что если вызываемый метод не обнаружен, он передаст его старому методуотсутствует.Просто не называйте никакие категории "находить" или что-то подобное, если вы хотите использовать какие-то уловки, подобные этой!
Таким же образом в действии вы можете сделать
class Activity < ActiveRecord::Base
belongs_to :activity_type
alias_method :old_method_missing, :method_missing
def method_missing(method, *args, &block)
if matchdata = /\Abelongs_to_category_(\w)\?/.match(method.to_s)
return ActivityCategory.find_by_name(matchdata[1]) == ActivityCategory.send(matchdata[1].to_sym)
else
old_method_missing(method, *args, &block)
end
end
end
IЯ не уверен, что синтаксис полностью правильный, но вы могли бы исследовать этот общий подход