3

我一直在寻找这个问题,但似乎无法找到答案,尽管我认为如果你比我更熟悉 Rails,这应该是一个很容易解决的问题。我正在尝试将多个 default_scope 条件添加到我的 Product 模型中。我的产品模型文件如下:

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) }

我知道这可能只是我不理解的语法。如果有人可以就如何解决这个问题给我建议,将不胜感激!谢谢!

4

1 回答 1

7

我想你想做的是这个

default_scope -> { where(active: true).order(created_at: :desc)  }

如此有效,您只是遇到了语法问题。当他们将新的lambda范围语法添加到 rails 时,由于其函数式编程起源(鉴于 rails 是面向对象的语言),许多 ruby​​ 开发人员对它有点陌生。实际上,代码段{}就像一个块并执行里面的代码。该where子句在声明范围的模型上被隐式调用。该where子句返回一个ActiveRecord关系对象(即数据库记录的集合),该对象实现order将通过传递的属性对关系中的记录进行排序的方法(在此case )根据传入的参数created_at以降序 ( desc) 或升序 ( ) 顺序排列。asc

于 2016-10-19T20:44:06.147 回答