让rails中多态关联的方法名更加人性化

rails中的多态关联功能,很好很强大。

但是多态关联的方法名却不够人性化,下面用代码来说话。

class Brand < ActiveRecord::Base
  has_many :evaluations,:as => :evaluation
end

class Page < ActiveRecord::Base
  has_many :evaluations,:as => :evaluation
end

class Evaluation < ActiveRecord::Base
  belongs_to :evaluation,:polymorphic => true
end


上面就是一个多态关联的经典代码,就不多说了。按代码的写法,当要在Evaluation中取Brand或者Page的值是,只能如此调用:
  evaluation.evaluation #Brand or Page

对于 evaluation.evaluation 这样的代码,你会不会感到有那么一点点的恶心呢?

假如可以这样:
  evaluation.brand # Brand 
  evaluation.page # Page

想必会更加的赏心悦目吧。

利用ruby的open class 和 method_missing 的特性,可以用下面的代码让代码更加美丽:
module ActiveRecord
  class Base
    def method_missing(name,*args)
      #      这个方法,可以自动对多态关联生成相关的名字(类名)
      resource = self.class.to_s.downcase
      if (self.respond_to? "#{resource}") && (self.send "#{resource}").class.to_s.downcase.eql?(name.to_s)
        self.send "#{resource}"
      elsif  (self.respond_to? "#{resource}=") && (self.send "#{resource}").class.to_s.downcase.eql?(name.to_s.sub('=',''))
        self.send "#{resource}",*args
      end
    end
end

你的 model 不用做任何的改动。

有时候美丽就是如此简单。

你可能感兴趣的:(Ruby,ActiveRecord,Rails)