说我有这个范围:
scope :with_zipcode, lambda { |zip| where(zipcode: zip) }
我想要一个等效的范围
scope :has_zipcode, lambda { |zip| where(zipcode: zip) }
有没有办法将一个范围别名?例如
之类的东西alias :with_zipcode, :has_zipcode
P.S。我知道这是一个人为的,不切实际的例子,只是想知道它是否可能!
谢谢!
答案 0 :(得分:23)
是的,你可以。请记住,范围是类方法,因此您需要在类的上下文中使用别名:
class User < ActiveRecord::Base
scope :with_zipcode, lambda { |zip| where(zipcode: zip) }
singleton_class.send(:alias_method, :has_zipcode, :with_zipcode)
end
答案 1 :(得分:1)
另一种解决方案是从另一个范围调用一个范围
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)
可能不那么模棱两可,而只是想提醒其他选项。
答案 2 :(得分:0)
为类方法定义别名的另一种方法,我个人认为这是不言而喻的:
class User < ActiveRecord::Base
scope :with_zipcode, lambda { |zip| where(zipcode: zip) }
class << self
alias has_zipcode with_zipcode
end
end