在我的ruby on rails项目中,我有一个不同部分的模型:A,B,C。A有不同的字段,具体取决于B和C的哪个实体可以适合。当用户放入A,B,C时在购物车中,我必须告诉他们A,B,C这些部件是否适合?
class A < ActiveRecord::Base
def supports_x(B)
...
return true
end
def supports_y(C)
...
return true
end
....10/15 methods like this
def report(cart)
report=[]
if support_x(cart.a)
report<<"a does not support x opporation"
end
.... like this 10/15 hand written if else operation.
end
end
就我个人而言,我可以写10/15类似的方法,如果是其他块,但我的直觉告诉我,我做错了,我违反了DRY原则。
有什么方法可以在ruby / rails中避免这种情况吗?
答案 0 :(得分:3)
您可以使用method_missing
方法,如下所示:
class A < ActiveRecord::Base
def method_missing(m, *args, &block)
if m.to_s.start_with? 'support_'
# Check the full method name and do whatever you want with args
else
super
end
end
def report(cart)
report=[]
parts = ['x', 'y', 'z']
parts.each do |part|
if self.send("support_#{part}", cart.a)
report << "a does not support #{part} operation"
end
end
end
end
请注意,我还没有对此进行过测试,它更像是一个伪代码,可以给你一个想法。