ラムダとRails 4スタイルの引数を持つスコープ?


144

Rails 4で以下がどのように行われるのか、または3と同じように4でも同じように引数を渡すことができるラムダを使用するためにRails 3アプローチを使用するだけなのかと思います。

私はRails 3にかなり慣れていないので、Rails 4を実行するサンプルをいくつか試してみます。

これが私のRails 3コードです:

class Person < ActiveRecord::Base
  scope :find_lazy, lambda {|id| where(:id => id)}
end

# In console I can call
Person.find_lazy(1)

したがって、これがRails 4の方法である場合、-> {}を使用することは、ラムダですよね?scope :all_lazy, -> { select("*") }議論が必要な場合はどうでしょうか。-> {}を使用すると、いくつかの異なるアイデアを試し、コンソールで引数エラーが発生しました。

回答:


305

私はそれがそうあるべきだと思います:

scope :find_lazy, -> (id) { where(id: id) }

2
サポートドキュメント、セクション14.1
デニス

3
イェイ、私が書くのを手伝ったscope :in_daterange, ->(start_date, end_date) { where(created_at: start_date.to_date.beginning_of_day..end_date.to_date.end_of_day) }
エピジェネ

4
Ruby 1.9を使用している場合、短いラムダ構文では、矢印とパラメーター(scope :find_lazy, ->(param))の間にスペースを入れられないことに注意してください。Ruby 2+ではスペースが許可されています。 詳細はこちら...
furman87

Rubyの「モダン」シンテックスscope :find_lazy, -> id { where id: id }
ソードレイ2017

11

Rubyも古いスタイルのラムダを廃止していません。そのため、より快適に使用したい場合は、ぜひお試しください。

私は個人的にスタビーラムダの構文が好きではありませんが、最終的にはおそらく標準になるので、慣れるのに害はありません。


6
私は構文が好きですが、矢印と関数本体の間に引数を配置するのは明らかに間違っているように感じます。私の数学の知識やコーヒースクリプトの構文で中断します)。最後に、「->」は値を結果にマッピングするようなものを言います。
hurikhan77

Rails 4.2で古いスタイルを使用すると、データベースから不正なブール値が返されるという状況に遭遇しました。正式には廃止されていない可能性がありますが、更新された構文を使用して問題を修正しました。
stevenspiel

1
@ hurikhan77ええ、構文がCoffeeScript coffeescript.org/#functions
Chloe

8

Rails 4では、次のことができます。

scope :find_lazy, -> (id) { where(id: id) }

それは古いルビーにありました:

:id => id

より良いハッシュ:

id: id

5

私は通常、以下のプログラミング構文を使用していました

scope :find_lazy, -> (id) { where(id: id) }

しかし、私がCodacyを使用してコードをレビューしているときに、この構文について警告していることがわかりました

Use the `lambda` method for multiline lambdas.

私はそれを変更し、うまくいきました

  scope :find_lazy, lambda {|id|
    where(id: id)
  }

2

関連付けをサポートするには:

scope :find_lazy, -> (object) { where(object_id: object.id) }

1
scope :find_lazy, -> (id) { where(id: id) }

と同等です

self.find_lazy(id)
  where(id: id)
end

Ruby on Railsガイドに基づく:Using a class method is the preferred way to accept arguments for scopes.

クラスメソッドよりもスコープをラムダと一緒に使用する理由はありません。それは個人的な好みの問題です。ただし、ガイドラインに従う場合は、引数が関係するときにクラスメソッドを使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.