[ruby on rails] concerns的使用

  • concern是用来把公共的方法提取到一起,保持代码DRY,是用module来实现的

model中的concern

ruby 复制代码
module Visible
  extend ActiveSupport::Concern

  VALID_STATUSES = ['public', 'private', 'archived']  # 其他地方引用  Visible::VALID_STATUSES
 
  # 关联关系 blongs_to, has_many 、validates、 scope 都需要写到 included block中
  included do
    belongs_to :user

    validates :status, inclusion: { in: VALID_STATUSES }
    validate do
      errors[:name] << '请输入名称' if name.to_s.splict(',').size < 2
    end
    
    scope :public_count, -> { where(status: 'public').count }
    
    # 类方法一
    def self.public_count
      where(status: 'public').count
    end
    
    # 类方法二
    class << self
      def public_count
        where(status: 'public').count
      end
    end
     
	# 实例方法
    def public?
      status == 'public'
    end
  end
  
  # 类方法三,写到 included 外面
  class_methods do
    def public_count
      where(status: 'public').count
    end
  end

  # 实例方法
  def archived?
    status == 'archived'
  end
end
相关推荐
女王大人万岁1 小时前
Golang标准库 CGO 介绍与使用指南
服务器·开发语言·后端·golang
myzzb1 小时前
纯python 最快png转换RGB截图方案 ——deepseek
开发语言·python·学习·开源·开发
程序员小假1 小时前
我们来说一下虚拟内存的概念、作用及实现原理
java·后端
宸迪2 小时前
【python】使用uv管理项目包依赖
linux·python·uv
qq_448011162 小时前
python中的内置globals()详解
开发语言·python
weixin_440401692 小时前
Coze-智能体Agent(工作流:自定义插件+选择器+知识库检索+大模型润色)
python·ai·coze
Ulyanov2 小时前
基于Python的单脉冲雷达导引头回波生成技术
python·算法·仿真·单脉冲雷达、
deepxuan2 小时前
Day2--python三大库-numpy
开发语言·python·numpy
徐同保2 小时前
python如何手动抛出异常
java·前端·python
无尽的沉默3 小时前
SpringBoot整合MyBatis-plus
spring boot·后端·mybatis