您可以在 Rails 中为作用域起别名吗?

Can you alias a scope in Rails?

假设我有这个范围:

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

我想要一个等效的范围

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

有没有办法将一个作用域别名为另一个作用域?例如像

alias :with_zipcode, :has_zipcode

P.S。我知道这是一个人为的和不切实际的例子,只是想知道它是否可能!

谢谢!

是的,你可以。请记住范围是 class 方法,因此您需要在 class:

的上下文中使用别名
class User < ActiveRecord::Base
  scope :with_zipcode, lambda { |zip| where(zipcode: zip) }
  singleton_class.send(:alias_method, :has_zipcode, :with_zipcode)
end

另一种解决方案是从另一个范围调用一个范围

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) 可能不那么含糊,但只是想提醒其他选项。

另一种为 class 方法定义别名的方法,我个人认为这种方法更多 self-explanatory:

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

  class << self
    alias has_zipcode with_zipcode
  end
end