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 回答