如何向Rails范围添加多个条件?

时间:2016-10-19 20:35:40

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5 default-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) }

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

1 个答案:

答案 0 :(得分:5)

我认为你要做的就是这个

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

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