0

RoRを少し使用していて、クエリ結果をフィルタリングする方法を見つけましたが、正しく実行されているかどうかはわかりません。他の新しい言語/技術と同様に、あなたは子供のスクリプトになり、私はそれが好きではありません。

私はこれを行うコントローラーを持っています

@events = Appointment.scoped
@events = @events.which_user(current_user.id)

次に、Appointmentモデルで、指定されたユーザーIDの予定のみを保持する次のコードがあります。

scope :which_user, lambda {|user_id| {:conditions => ["user_id = ?", user_id]}}

私はこのコードを例から考え出したのですが、それでもほとんど理解できません。この場合、Rubyの魔法はどのように機能するのか誰かに教えてもらえますか?

4

1 に答える 1

2

さて、ほとんどのRuby on Railsのものと同様に、それを機能させるために舞台裏であらゆる種類の魔法が起こっていますが、基本的には:

@events = Appointment.scoped

SQLクエリの表現を作成しますが、実行しません。これにより、クエリを実行する前に、必要に応じてクエリを変更できます。デフォルトのクエリは、テーブル内のすべての行のすべてのフィールドを選択することです。

scope :which_user, lambda {|user_id| {:conditions => ["user_id = ?", user_id]}}

SQLクエリに条件(または順序など)を追加する方法を定義します。したがって、を呼び出すと、のすべての制限と、に等しくなければならない追加の制限をsomequery.which_user(3)持つ別のクエリが返されます。somequeryuser_id3

@events = @events.which_user(current_user.id)

私が上で述べたことを実行します。これ@eventsは、正しい。を持つ行のみのすべてのフィールドを返すクエリですuser_id

そして、Railsの魔法の最後のビットは、これらのクエリが自動的に実行され、使用時にレコードの配列に変換されることです。eachこれをトリガーするのはそのような機能です。レコードを反復処理する場合は、反復処理する実際のレコードが必要になります。そのため、Railsはクエリを実行し、それらを取得します。

お役に立てば幸いです。漠然としたものが残っている場合はお知らせください。

PS: デフォルトのRailsメソッドもありますwhere。これは非常によく似た方法で機能します。このような単純な条件の場合、次を使用するよりもおそらく簡単ですscope

@events = Appointment.where(:user_id => current_user.id)
于 2012-08-23T22:56:27.670 に答える