web-dev-qa-db-ja.com

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

Rails 4で以下がどのように行われるのか、または4と同じ方法で引数を渡すことができるラムダを使用するためにRails 3アプローチを使用する場合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("*") }引数が必要な場合はどうなりますか。 -> {}を使用すると、いくつかの異なるアイデアを試し、コンソールで引数エラーを取得しました。

139
kaplan

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

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

Rubyも古いスタイルのlambdaを廃止していません。したがって、それを使用することをより快適に感じる場合は、ぜひそれを使用してください。

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

10
Branden Silva

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

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

それは古いRubyにありました:

:id => id

より良いハッシュ:

id: id
7
sesperanto

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

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

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

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

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

Use the `lambda` method for multiline lambdas.

私はそれを変更し、うまく機能しました

  scope :find_lazy, lambda {|id|
    where(id: id)
  }
2
Astm
scope :find_lazy, -> (id) { where(id: id) }

と同等です

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

Ruby on Rails guideUsing a class method is the preferred way to accept arguments for scopes.に基づく

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

0
mmsilviu