21

このスコープがあるとします:

scope :with_zipcode, lambda { |zip| where(zipcode: zip) }

同等のスコープが必要です

scope :has_zipcode, lambda { |zip| where(zipcode: zip) }

あるスコープを別のスコープにエイリアスする方法はありますか? たとえば、次のようなもの

alias :with_zipcode, :has_zipcode

PSこれは不自然で非現実的な例であることは知っていますが、それが可能かどうか知りたいだけです!

ありがとう!

4

3 に答える 3

36

はい、できます。スコープはクラス メソッドであるため、クラスのコンテキストでエイリアスを作成する必要があることを覚えておいてください。

class User < ActiveRecord::Base
  scope :with_zipcode, lambda { |zip| where(zipcode: zip) }
  singleton_class.send(:alias_method, :has_zipcode, :with_zipcode)
end
于 2015-08-28T23:15:10.577 に答える
11

クラスメソッドのエイリアスを定義する別の方法は、個人的にはもう少し自明だと思います。

class User < ActiveRecord::Base
  scope :with_zipcode, lambda { |zip| where(zipcode: zip) }

  class << self
    alias has_zipcode with_zipcode
  end
end
于 2019-07-11T07:46:33.703 に答える
9

別の解決策は、あるスコープを別のスコープから呼び出すことです

class User < ActiveRecord::Base
  scope :with_zipcode, lambda { |zip| where(zipcode: zip) }
  scope :has_zipcode,  lambda { |zip| with_zipcode(zip)   } # essentially an alias
end

使用singleton_class.send(:alias_method, :a, :b)はおそらくあいまいではありませんが、別のオプションに警告したかっただけです。

于 2018-09-05T18:22:47.030 に答える