ActiveRecord使用作用域scope简化查询

在rails中做模型查询的时候可以通过作用域把一些常用的查询操作进行简化处理.所有的作用域操作之后都可以继续调用其他的查询条件.

# app/models/book.rb
class Book < ApplicationRecord
  default_scope { order('id desc') } # 默认作用域,设置模型默认id倒序
  scope :expensive, -> { where('price > 50') } # 价格高于50的数据
end
# 查询的时候可以直接使用
Book.create(title: '从你的全世界路过', price: '30.98')
Book.create(title: '三国演艺', price: '59.93')
Book.create(title: '水浒传', price: '60.98')
Book.create(title: '解忧杂货铺', price: '27.03')
books = Book.expensive # 获取价格高于50的书,按id倒序排列

scope作用域相当于类方法,上面的方法可以按照如下的写法,效果一样:

# app/models/book.rb
class Book < ApplicationRecord
  def self.default_scope
    order('id desc')
  end
  
  def self.expensive
    where('price > 50')
  end
  
  # 价格大于指定值的数据
  def self.price_above(price)
    where("price > #{price}")
  end
end

两种scope的写法都可以使用,根据个人喜好.
获取价格大于指定值的数据:

Book.price_above(60)
# 多个作用域可以串联使用
Book.expensive.price_above(60) # 可以看到两个作用域的条件使用and符号进行关联

可以通过unscoped删除作用域,执行默认的查询

Book.unscoped # 删除作用域
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 2013年8月2日, 严清 译译文:理解AngularJS的作用域Scope原文:Understanding Sc...
    竿牍阅读 2,939评论 0 0
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,733评论 0 13
  • 穷也一身,潦也一生,挥之不去的困顿 庸也一人,不名一文,找不到支撑,在凡尘中沉沦,沦为次等 岁月静默无闻,磨平所有...
    王家子弟阅读 1,247评论 0 0
  • 我不怕在这个坏时代中沉默怕只怕 我和很多人一样醉心于愤恨与狂欢不去读书,不去思考学不会倾听与宽容以至于有一天 当好...
    kevinzhon阅读 8,518评论 3 12
  • 前世五百年的回眸,才换来今生的一次擦肩。缘来,在不知不觉,情定在于无声处。 堪那岁月鬓白,甚是倾心入画。心中有你,...
    心灵鸡汤同学阅读 3,352评论 0 0

友情链接更多精彩内容