为所有model添加通用的方法

来源:互联网 发布:java swing 教程 编辑:程序博客网 时间:2024/06/06 01:22

业务代码中,我们经常会用到各种状态、类型表,通过判断状态或类型来设计业务逻辑。比如说我们有订单orders和订单状态order_statuses,当订单为草稿状态时可以继续往下操作,常见的判断:

if order.order_status_id == 1  do_sthend

为避免产生魔法发数字,我们会这么写:

status_id = OrderStatus.find_by_name("草稿").try(:id)if order.order_status_id == status_id  do_sthend

上面这种先查找,再比较的代码会在各个方法中反复出现,可以写一个通用的方法,每个model中都可以调用。

上个项目使用的是rails 1.9.3 ,所有的model都是继承ActiveRecord::Base ,做法如下:

module ActiveRecord  class Base    def model_status_is?(status_name, *matching_status)        st = self.send(status_name)        if !st or !st.code          return false        end        [matching_status].flatten.map(&:to_sym).include?(st.code.to_sym)      end  endend

当前项目使用rails 5.1.4,从rails 5开始,所有的model均继承自ApplicationRecord

# app/models/application_record.rbclass ApplicationRecord < ActiveRecord::Base  self.abstract_class = trueend

ApplicationRecord替代了对ActiveRecord::Base的猴子补丁,成为当前应用所需的全部自定义和扩展的唯一入口。ApplicationRecord作为抽象类,是modelActiveRecord::Base的中间层,我们对ApplicationRecord的扩展不会影响ActiveRecord::Base

言归正传,在rails 5中我们实现上面的功能需要这样做:

module Base  def self.included(base)    base.class_eval do      def model_status_is?(status_name, *matching_status)        st = self.send(status_name)        if !st or !st.code          return false        end        [matching_status].flatten.map(&:to_sym).include?(st.code.to_sym)      end    end  endend

最后在app/models/application_record.rbinclude上面定义的module

原创粉丝点击