为所有model添加通用的方法

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

if order.order_status_id == 1
  do_sth
end

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

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

上面这种先查找,再比较的代码会在各个方法中反复出现,可以写一个通用的方法,每个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
  end
end

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

# app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

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
  end
end

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值