在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 # 删除作用域
网友评论