范围从纯字符串语法更改为哈希语法

时间:2016-09-27 16:41:51

标签: ruby-on-rails ruby activerecord

我在模型中有以下范围:

class Office < ApplicationRecord
  belongs_to :money_pot
  has_one :fiscal_year, through: :money_pot
  has_one :money_type, through: :money_pot

  scope :order_by_fiscal_year_and_money_type, -> {
      joins(money_pot: [:fiscal_year, :money_type])
      .order("fiscal_years.end_date desc, money_types.short_name")}
end

此范围确实有效。但是:我想从“纯字符串”语法切换到该order子句中的“哈希”语法。我认为我遇到了麻烦,因为范围内的order条款是关联的。

这是我尝试过的但它不起作用:

scope :order_by_fiscal_year_and_grant_type, -> {
    joins(money_pot: [:fiscal_year, :money_type])
    .order(fiscal_years: {end_date: :desc}, money_types: {short_name: :asc})}

这是它返回的错误:

  

方向“{:end_date =&gt;:desc}”无效。有效指示是:[:asc,:desc,:ASC,:DESC,“asc”,“desc”,“ASC”,“DESC”]

我查看了Active Record Query Interface Rails指南的ordering sectionhash conditions部分。

如何将此范围完全转换为哈希语法?

1 个答案:

答案 0 :(得分:3)

have found不使用普通字符串的唯一方法是merge

scope :order_by_fiscal_year_and_money_type, lambda {
  joins(money_pot: [:fiscal_year, :money_type])
    .merge(FiscalYears.order(end_date: :desc)
    .merge(MoneyType.order(:short_name)
}