たとえば、次のようなActiveRecordクエリがあります。
@result = stuff.limit(10)
where stuffは、where句、order byなどのアクティブレコードクエリです...
さて、なぜそのようなマジックナンバーをコントローラーに渡すのかと思いましたか? 「limit(10)」のスコープを定義し、代わりにそれを使用することは良い習慣だと思いますか?構文はどのようになりますか?
スコープは他のように見えます(クラスメソッドを好むかもしれませんが)。たとえば、
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
always(または「ほぼ」常に)その制限が必要な場合は、デフォルトのスコープを使用します。
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
実際にそのような方法は複数あり、クラスメソッドは@Dave Newtonが指摘したものです。スコープを使用したい場合は、次のようにします。
scope :max_records, lambda { |record_limit|
limit(record_limit)
}
またはRuby 1.9 "stabby"ラムダ構文と複数の引数を使用します。
scope :max_records, ->(record_limit, foo_name) { # No space between "->" and "("
where(:foo => foo_name).limit(record_limit)
}
スコープとクラスメソッドのより深い違いを知りたい場合は、 このブログ投稿 を確認してください。
それが役に立てば幸い。乾杯!
スコープはこのためのものです
スコーピングにより、関連オブジェクトまたはモデルのメソッド呼び出しとして参照できる一般的に使用されるArelクエリを指定できます。これらのスコープを使用すると、以前にカバーした、where、join、includeなどのすべてのメソッドを使用できます。すべてのスコープメソッドはActiveRecord :: Relationオブジェクトを返します。これにより、他のスコープなどのメソッドを呼び出すことができます。
出典: 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)
Railsパラメータ付きモデルのスコープ:
scope :scope_name, -> (parameter, ...) { where(is_deleted: parameter, ...) }
または:
scope :scope_name, lambda{|parameter, ...| where(is_deleted:parameter, ...)}