[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
相关推荐
白云千载尽3 分钟前
LQR与MPC.入门知识与实验
python·控制·mpc·lqr
weixin_433179335 分钟前
Hangman 猜字游戏使用列表List实现
开发语言·python
Marktowin36 分钟前
SpringBoot项目的国际化流程
java·后端·springboot
程序员泠零澪回家种桔子1 小时前
RAG中的Embedding技术
人工智能·后端·ai·embedding
汤姆yu1 小时前
基于springboot的直播管理系统
java·spring boot·后端
52Hz1181 小时前
二叉树理论、力扣94.二叉树的中序遍历、104.二叉树的最大深度、226.反转二叉树、101.对称二叉树
python·算法·leetcode
a努力。1 小时前
虾皮Java面试被问:分布式Top K问题的解决方案
java·后端·云原生·面试·rpc·架构
卖个几把萌1 小时前
解决 Python 项目依赖冲突:使用 pip-tools 一键生成现代化的 requirements.txt
开发语言·python·pip
黎雁·泠崖1 小时前
Java字符串入门:API入门+String类核心
java·开发语言·python
哈哈不让取名字1 小时前
用Pygame开发你的第一个小游戏
jvm·数据库·python