您可以在 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
假设我有这个范围:
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