さて、ほとんどのRuby on Railsのものと同様に、それを機能させるために舞台裏であらゆる種類の魔法が起こっていますが、基本的には:
@events = Appointment.scoped
SQLクエリの表現を作成しますが、実行しません。これにより、クエリを実行する前に、必要に応じてクエリを変更できます。デフォルトのクエリは、テーブル内のすべての行のすべてのフィールドを選択することです。
scope :which_user, lambda {|user_id| {:conditions => ["user_id = ?", user_id]}}
SQLクエリに条件(または順序など)を追加する方法を定義します。したがって、を呼び出すと、のすべての制限と、に等しくなければならない追加の制限をsomequery.which_user(3)
持つ別のクエリが返されます。somequery
user_id
3
@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)