25

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

@result = stuff.limit(10)

where stuff は、where 句、order by などを使用したアクティブなレコード クエリです。

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

4

5 に答える 5

53

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

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

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

于 2013-03-05T16:52:12.143 に答える
23

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

スコープを使用すると、関連付けオブジェクトまたはモデルのメソッド呼び出しとして参照できる、一般的に使用される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
于 2013-03-05T16:44:17.657 に答える
17

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

範囲の定義

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

呼び出し方法

name_of_scope(parameter_name)
于 2014-01-06T13:41:21.537 に答える
2

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

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
于 2013-03-05T16:48:02.450 に答える
2

次のパラメーターを使用した Rails モデルのスコープ:

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

または:

scope :scope_name, lambda{|parameter, ...| where(is_deleted:parameter, ...)} 
于 2016-08-04T09:28:32.383 に答える