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("*") }
引数が必要な場合はどうなりますか。 -> {}を使用すると、いくつかの異なるアイデアを試し、コンソールで引数エラーを取得しました。
私はそれがあるべきだと思う:
scope :find_lazy, -> (id) { where(id: id) }
Rubyも古いスタイルのlambdaを廃止していません。したがって、それを使用することをより快適に感じる場合は、ぜひそれを使用してください。
私は個人的にスタビーラムダの構文が好きではありませんが、最終的にはおそらく標準になるので、慣れるのに害はありません。
Rails 4では、次のことができます。
scope :find_lazy, -> (id) { where(id: id) }
それは古いRubyにありました:
:id => id
より良いハッシュ:
id: id
関連付けをサポートするには:
scope :find_lazy, -> (object) { where(object_id: object.id) }
私は通常、以下のプログラミング構文を使用していました
scope :find_lazy, -> (id) { where(id: id) }
しかし、私はCodacyを使用してコードをレビューしているときに、この構文について警告していることがわかりました
Use the `lambda` method for multiline lambdas.
私はそれを変更し、うまく機能しました
scope :find_lazy, lambda {|id|
where(id: id)
}
scope :find_lazy, -> (id) { where(id: id) }
と同等です
self.find_lazy(id)
where(id: id)
end
Ruby on Rails guide :Using a class method is the preferred way to accept arguments for scopes.
に基づく
クラスメソッドよりもスコープをラムダと共に使用する理由はありません。それは個人的な好みの問題です。ただし、ガイドラインに従う場合は、引数が関係するときにクラスメソッドを使用する必要があります。