Rails 5:如何将此named_scope转换为作用域

Rails 5: How to convert this named_scope to a scope

我希望是一个简单的问题。

如何将此 named_scope 行从 rails 2 应用程序转换为 rails 5

的范围行

原创...

  named_scope :effective_on, lambda { |date|
    { :conditions => ['(effective_on IS NULL OR effective_on <= ?) AND (ineffective_on IS NULL OR ineffective_on > ?)', date, date] }
  }

我试过了,但它只是将条件行作为字符串打印出来...

  scope :effective_on, lambda { |date|
    { :conditions => ['(effective_on IS NULL OR effective_on <= ?) AND (ineffective_on IS NULL OR ineffective_on > ?)', date, date] }
  }

我怀疑这是因为 Rails 5.0 不推荐使用“条件”,但是当我尝试在这个版本中用“where”替换它时,它在我面前爆炸了...

  scope :effective_on, lambda { |date|
    { where('(effective_on IS NULL OR effective_on <= ?) AND (ineffective_on IS NULL OR ineffective_on > ?)', date, date) }
  }

... 在我的脸上爆炸:在我的 IDE 中整个“哪里”线亮起红色,它告诉我“预期:=>”

这就是我难过的地方。

问题是旧 Rails 版本中的范围 return 像 { :conditions => 'some conditions } 一样散列,但在较新版本中它 return 是一个活动记录关系(就像 where 方法的 return 值)

所以你必须改变:

scope :effective_on, lambda { |date|
  { :conditions => ['(effective_on IS NULL OR effective_on <= ?) AND (ineffective_on IS NULL OR ineffective_on > ?)', date, date] }
}

scope :effective_on, lambda { |date|
  where('(effective_on IS NULL OR effective_on <= ?) AND (ineffective_on IS NULL OR ineffective_on > ?)', date, date)
}

没有那个 { } where 调用