检查rails模型对象中一系列一致性的简便方法

时间:2015-06-24 11:45:12

标签: ruby-on-rails ruby

在我的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中避免这种情况吗?

1 个答案:

答案 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

请注意,我还没有对此进行过测试,它更像是一个伪代码,可以给你一个想法。