これは実際にはスコープではありません。スコープのように見えるようにラップされたクラス メソッドにすぎません。2 つの問題があります。
- あなたは
ReleaseSchedule.where(...)
「スコープ」を連鎖できないと言っているので(つまりReleaseSchedule.where(...).next_release
、それがすべきことをしません)。
- 「スコープ」はで終わる
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
、意図を表現すること (つまり、クエリを少しずつ構築すること) であり、あなたが行っていることはその意図と一致しません。