我有两个类:
class Activity < ActiveRecord::Base
belongs_to :activity_type
def belongs_to_cat_a?
self.activity_category == ActivityCategory.category_a
end
def belongs_to_cat_b?
self.activity_category == ActivityCategory.category_b
end
end
class ActivityCategory < ActiveRecord::Base
has_many :activities
def self.cat_a
ActivityCategory.find_by_name("CatA")
end
def self.cat_b
ActivityCategory.find_by_name("CatB")
end
end
使用元编程,我将 ActivityCategory 更改为以下内容:
class ActivityCategory < ActiveRecord::Base
has_many :activities
CATEGORIES = ['CatA', 'CatB']
class << self
CATEGORIES.each do |c|
define_method "#{c.underscore.downcase}" do # for ex: cat_a
find_by_name(c)
end
end
end
end
好的。现在想象在 Activity 类中,我有大约 12 个方法来检查它属于哪个类别。
似乎是使用 MP 进行 DRY'd up 的完美候选人。
我该怎么做?
最佳答案
我不确定这是 MP 的合适人选。首先,您正在对类别进行硬编码,这马上就是编写代码,而不是生成代码。如果您想在询问是否属于某个类别时返回 true/false 语句,您可以执行以下操作:
class Activity < ActiveRecord::Base
...
def belongs_to? activity
activity_type.name == activity
end
end
然后这样执行...
a = Activity.save(:activity_category => ActivityCategory.new(:name => "CatA")
a.belongs_to? "CatA" #=> true
还是我没捕获要点?
关于ruby-on-rails - 涉及 has_many & belongs_to 关联的元编程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4789235/