为所有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
作为抽象类,是model
和ActiveRecord::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.rb
中include
上面定义的module
阅读全文
1 0
- 为所有model添加通用的方法
- DataTable转换为List<Model>的通用方法
- Django为所有Model增加同样的权限的便捷方法
- Django为所有Model增加同样的权限的便捷方法
- 将DataGrid中所有选中项转换为自定义model的方法
- DataTable转换为List<Model>的通用类
- DataTable转换为List<Model>的通用类
- 对所有对象都通用的方法
- 所有对象都通用的方法
- 对所有对象都通用的方法
- 对于所有对象都通用的方法
- 对于所有对象都通用的方法
- 对于所有方法都通用的对象
- 对于所有对象都通用的方法
- 对于所有对象都通用的方法
- 对于所有对象都通用的方法
- 对于所有对象都通用的方法
- 所有浏览器通用的js添加收藏夹代码
- 动态添加 Redis 密码认证
- leetCode-Search Insert Position
- 初试Vuforia开发AR(V客学院知识分享)
- 游戏开发学习笔记(五)人物的移动及相机的跟随
- Linux中MySQL中文乱码解决
- 为所有model添加通用的方法
- 深入理解 Spring 事务原理
- centos上yum命令不能用了解决方案
- PHP 升级到5.5后MySQL的代替法
- 微信小程序调用函数
- html表单元素的colspan和rowspan
- CentOS 7 配置本地源
- 第一讲:从c到c++
- 如何实现微信小程序与.net core应用服务端的无状态身份验证