23

引数の有無にかかわらずスコープを呼び出すことができるように、オプションの引数を使用してスコープを作成することは可能ですか?

何かのようなもの:

scope :with_optional_args,  lambda { |arg|
  where("table.name = ?", arg)
}

Model.with_optional_args('foo')
Model.with_optional_args

引数が指定されている場合 (Unixmonkey で説明されているように) ラムダ ブロックをチェックインできますが、引数なしでスコープを呼び出すと、ArgumentError: wrong number of arguments (0 for 1)

4

7 に答える 7

28

Ruby 1.9 では、ブロックがメソッドと同じ機能を持つように拡張されました (デフォルト値はその中にあります)。

scope :cheap, lambda{|max_price=20.0| where("price < ?", max_price)}

電話:

Model.cheap
Model.cheap(15)
于 2012-04-26T19:05:58.150 に答える
22

はい。メソッドで使用するのと同じように a を使用するだけ*です。

scope :print_args, lambda {|*args|
    puts args
}
于 2012-04-26T18:52:06.230 に答える
14

数週間前に使用scope :name, ->(arg1, arg2 = value) { ... }しましたが、私の記憶が正しければ、うまく機能しました。ruby 1.9以降で使用するには

于 2012-04-26T18:48:24.360 に答える
11

特定の引数に基づいてスコープを条件付きで変更できます。

scope :random, ->(num = nil){ num ? order('RANDOM()').limit(num) : order('RANDOM()') }

使用法:

Advertisement.random # => returns all records randomized
Advertisement.random(1) # => returns 1 random record

または、デフォルト値を指定できます。

scope :random, ->(num = 1000){ order('RANDOM()').limit(num) }

使用法:

Product.random # => returns 1,000 random products
Product.random(5) # => returns 5 random products

注: に示されてRANDOM()いる構文は、Postgres に固有のものです。示されている構文は Rails 4 です。

于 2014-08-20T16:47:12.060 に答える
4

ガイドによると、スコープに引数を渡すための推奨される方法は、次のようにクラス メソッドを使用することです。

class Post < ActiveRecord::Base
  def self.1_week_before(time)
    where("created_at < ?", time)
  end
end

これにより、よりクリーンなアプローチが可能になります。

于 2013-02-11T23:59:44.460 に答える
1

そうです。

scope :with_optional_args,  Proc.new { |arg|
  if arg.present?
    where("table.name = ?", arg)
  end
}
于 2012-04-26T17:59:31.590 に答える