1

ReleaseSchedule.next_release他のコントローラーで呼び出す

次のエラーが発生しました

NoMethodError (undefined method `to_criteria' for #<ReleaseSchedule:0x007f9cfafbfe70>):
  app/controllers/weekly_query_controller.rb:15:in `next_release'

release_schedule.rb

class ReleaseSchedule
  scope :next_release, ->(){ ReleaseSchedule.where(:release_date.gte => Time.now).without(:_id, :created_at, :updated_at).first }
end
4

1 に答える 1

4

これは実際にはスコープではありません。スコープのように見えるようにラップされたクラス メソッドにすぎません。2 つの問題があります。

  1. あなたはReleaseSchedule.where(...)「スコープ」を連鎖できないと言っているので(つまりReleaseSchedule.where(...).next_release、それがすべきことをしません)。
  2. 「スコープ」はで終わるfirstため、クエリは返されず、単一のインスタンスが返されるだけです。

2はおそらく NoMethodError の由来です。

何らかの理由で本当にスコープにしたい場合は、次のように言います。

# No `first` or explicit class reference in here.
scope :next_release, -> { where(:release_date.gte => Time.now).without(:_id, :created_at, :updated_at) }

そしてそれを次のように使用します:

# The `first` goes here instead.
r = ReleaseSchedule.next_release.first

しかし、実際には、クラス メソッドが必要なだけです。

def self.next_release
  where(:release_date.gte => Time.now).without(:_id, :created_at, :updated_at).first
end

scope結局のところ、マクロは、クラス メソッドを構築するための凝った方法にすぎません。私たちが持っている唯一の理由はscope、意図を表現すること (つまり、クエリを少しずつ構築すること) であり、あなたが行っていることはその意図と一致しません。

于 2015-01-17T04:28:02.093 に答える