web-dev-qa-db-ja.com

スコープへのパラメーターの追加

たとえば、次のようなActiveRecordクエリがあります。

@result = stuff.limit(10)

where stuffは、where句、order byなどのアクティブレコードクエリです...

さて、なぜそのようなマジックナンバーをコントローラーに渡すのかと思いましたか? 「limit(10)」のスコープを定義し、代わりにそれを使用することは良い習慣だと思いますか?構文はどのようになりますか?

23
Bohn

スコープは他のように見えます(クラスメソッドを好むかもしれませんが)。たとえば、

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
2
Dave Newton

実際にそのような方法は複数あり、クラスメソッドは@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)
}

スコープとクラスメソッドのより深い違いを知りたい場合は、 このブログ投稿 を確認してください。

それが役に立てば幸い。乾杯!

47
Andre Bernardes

スコープはこのためのものです

スコーピングにより、関連オブジェクトまたはモデルのメソッド呼び出しとして参照できる一般的に使用される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
20
AnkitG

Railsスコープでパラメータを渡す

スコープの定義

scope :name_of_scope, ->(parameter_name) {condition whatever you want to put in scope}

メソッドの呼び出し

name_of_scope(parameter_name)
16
deep gupta

Railsパラメータ付きモデルのスコープ:

scope :scope_name, -> (parameter, ...) { where(is_deleted: parameter, ...) }  

または:

scope :scope_name, lambda{|parameter, ...| where(is_deleted:parameter, ...)} 
1
Manoj Datt