如何向 Rails 范围添加多个条件?
How to add multiple conditions to Rails scope?
我已经找了一段时间了,但似乎找不到答案,不过我认为,如果您对 Rails 的经验比我丰富,那么这应该是一个很容易解决的问题是。我正在尝试向我的产品模型添加多个 default_scope 条件。我的产品模型文件如下:
class Product < ApplicationRecord
has_many :order_items
default_scope { where(active: true) }
validates :name, presence: true, length: { maximum: 300 }
PRICE_REGEXP = /\A\d{1,4}(\.\d{0,2})?\z/
validates :price, presence: true,
numericality: true,
format: { with: PRICE_REGEXP }
validates :description, presence: true, length: { maximum: 1000 },
allow_nil: true
end
我也想补充
default_scope -> { order(created_at: desc) }
以便产品索引页上的新产品采用最新的在前的格式。每当我执行类似以下操作时,我都会收到语法错误消息:
default_scope -> { order(created_at: desc) }, { where(active: true) }
或
default_scope -> { order(created_at: desc), where(active: true) }
或
default_scope -> { order(created_at: desc) where(active: true) }
我知道这可能只是我不理解的语法问题。如果有人可以就如何解决此问题给我建议,将不胜感激!谢谢!
我想你想做的是这个
default_scope -> { where(active: true).order(created_at: :desc) }
实际上你只是遇到了语法问题。当他们将新的 lambda 作用域语法添加到 rails 时,由于它的函数式编程起源(假设 rails 是面向对象的语言),很多 ruby 开发人员有点陌生).实际上 {}
中的代码段就像一个块并执行其中的代码。 where
子句在声明范围的模型上隐式调用。 where
子句 returns 一个 ActiveRecord
关系对象(即数据库记录的集合)实现order
方法将按传递的属性(在本例中为 created_at
)按降序 (desc
) 或升序 (asc
) 对关系中的记录进行排序根据传入的参数。
我已经找了一段时间了,但似乎找不到答案,不过我认为,如果您对 Rails 的经验比我丰富,那么这应该是一个很容易解决的问题是。我正在尝试向我的产品模型添加多个 default_scope 条件。我的产品模型文件如下:
class Product < ApplicationRecord
has_many :order_items
default_scope { where(active: true) }
validates :name, presence: true, length: { maximum: 300 }
PRICE_REGEXP = /\A\d{1,4}(\.\d{0,2})?\z/
validates :price, presence: true,
numericality: true,
format: { with: PRICE_REGEXP }
validates :description, presence: true, length: { maximum: 1000 },
allow_nil: true
end
我也想补充
default_scope -> { order(created_at: desc) }
以便产品索引页上的新产品采用最新的在前的格式。每当我执行类似以下操作时,我都会收到语法错误消息:
default_scope -> { order(created_at: desc) }, { where(active: true) }
或
default_scope -> { order(created_at: desc), where(active: true) }
或
default_scope -> { order(created_at: desc) where(active: true) }
我知道这可能只是我不理解的语法问题。如果有人可以就如何解决此问题给我建议,将不胜感激!谢谢!
我想你想做的是这个
default_scope -> { where(active: true).order(created_at: :desc) }
实际上你只是遇到了语法问题。当他们将新的 lambda 作用域语法添加到 rails 时,由于它的函数式编程起源(假设 rails 是面向对象的语言),很多 ruby 开发人员有点陌生).实际上 {}
中的代码段就像一个块并执行其中的代码。 where
子句在声明范围的模型上隐式调用。 where
子句 returns 一个 ActiveRecord
关系对象(即数据库记录的集合)实现order
方法将按传递的属性(在本例中为 created_at
)按降序 (desc
) 或升序 (asc
) 对关系中的记录进行排序根据传入的参数。