たとえば、次のような ActiveRecord クエリがあります。
@result = stuff.limit(10)
where stuff は、where 句、order by などを使用したアクティブなレコード クエリです。
なぜそのようなマジック ナンバーをコントローラーに渡す必要があるのか考えてみました。それで、「limit(10)」のスコープを定義し、代わりにそれを使用するのは良い習慣だと思いますか? 構文はどのようになりますか?
たとえば、次のような ActiveRecord クエリがあります。
@result = stuff.limit(10)
where stuff は、where 句、order by などを使用したアクティブなレコード クエリです。
なぜそのようなマジック ナンバーをコントローラーに渡す必要があるのか考えてみました。それで、「limit(10)」のスコープを定義し、代わりにそれを使用するのは良い習慣だと思いますか? 構文はどのようになりますか?
そのようなことを行うには実際に複数の方法があり、クラスメソッドは@Dave Newtonによって指摘されたものです。スコープを使用する場合は、次のようにします。
scope :max_records, lambda { |record_limit|
limit(record_limit)
}
または、Ruby 1.9 の「安定した」ラムダ構文と複数の引数を使用します。
scope :max_records, ->(record_limit, foo_name) { # No space between "->" and "("
where(:foo => foo_name).limit(record_limit)
}
スコープとクラス メソッドのより深い違いを知りたい場合は、このブログ投稿をチェックしてください。
それが役に立てば幸い。乾杯!
まあスコープはこれのためのものです
スコープを使用すると、関連付けオブジェクトまたはモデルのメソッド呼び出しとして参照できる、一般的に使用されるArelクエリを指定できます。これらのスコープを使用すると、where、joins、includesなど、これまでに説明したすべてのメソッドを使用できます。すべてのスコープメソッドはActiveRecord::Relationshipオブジェクトを返します。これにより、他のメソッド(他のスコープなど)を呼び出すことができます。
ソース: http: //guides.rubyonrails.org/active_record_querying.html#scopes
したがって、自分が持っている一般的なクエリがあると感じた場合、または多くの人に共通するクエリに何らかの連鎖が必要な場合。次に、繰り返しを防ぐためにスコープを選択することをお勧めします。
次に、スコープがあなたの場合にどのように見えるかを答えます
class YourModel < ActiveRecord::Base
scope :my_limit, ->(num) { limit(num)}
scope :your_where_condition, ->(num) { where("age > 10").mylimit(num) }
end
Rails スコープでパラメーターを渡す
範囲の定義
scope :name_of_scope, ->(parameter_name) {condition whatever you want to put in scope}
呼び出し方法
name_of_scope(parameter_name)
スコープは他のものと同じように見えます (ただし、クラス メソッドを好むかもしれません)。たとえば、
class Stuff < ActiveRecord::Base
def self.lim
limit(3)
end
end
> Stuff.lim.all
=> [#<Stuff id: 1, name: "foo", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
#<Stuff id: 2, name: "bnar", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
#<Stuff id: 3, name: "baz", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">]
> Stuff.all.length
=> 8
常に(または「ほとんど」常に) その制限が必要な場合は、既定のスコープを使用します。
class Stuff < ActiveRecord::Base
attr_accessible :name, :hdfs_file
default_scope limit(3)
end
> Stuff.all
=> [#<Stuff id: 1, name: "foo", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
#<Stuff id: 2, name: "bnar", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">,
#<Stuff id: 3, name: "baz", created_at: "2013-03-01 17:58:32", updated_at: "2013-03-01 17:58:32">]
> Stuff.all.length
=> 3
デフォルトのスコープをスキップするには:
> Stuff.unscoped.all.size
=> 8
次のパラメーターを使用した Rails モデルのスコープ:
scope :scope_name, -> (parameter, ...) { where(is_deleted: parameter, ...) }
または:
scope :scope_name, lambda{|parameter, ...| where(is_deleted:parameter, ...)}