[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
相关推荐
小江的记录本5 小时前
【Java并发编程】锁机制:volatile:JMM内存模型、可见性/禁止指令重排、内存屏障、单例模式中的应用(附《思维导图》+《面试高频考点清单》)
java·后端·python·mysql·单例模式·面试·职场和发展
csdn小瓯5 小时前
前端工程化:React + TypeScript + Tailwind CSS 的组件化实践
开发语言·人工智能·python
hef2885 小时前
R包grafify:简单操作实现高效统计绘图
开发语言·python·r语言
这是谁的博客?5 小时前
Python 异步编程核心原理与实践深度解析
java·网络·python·协程·asyncio·异步编程
战南诚5 小时前
力扣 之 198.打家劫舍
python·算法·leetcode
晚烛5 小时前
CANN 模型预热:消除首次推理延迟
开发语言·python
无风听海5 小时前
深入理解 ASP.NET Core 中的 UseRouting 与 UseEndpoints
后端·asp.net
fliter5 小时前
Rust 中的递归迭代器:一次让编译器教你理解 impl Trait 与生命周期的旅程
后端
考虑考虑5 小时前
JDK26支持Http3属性
java·后端·java ee
Fanxt_Ja5 小时前
Langchain+Tavily对接大模型实现联网搜索
python·langchain·deepseek·tavily