你可以在Rails中为一个范围别名吗?

时间:2015-08-28 22:27:53

标签: ruby-on-rails activerecord rails-activerecord alias named-scopes

说我有这个范围:

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

我想要一个等效的范围

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

有没有办法将一个范围别名?例如

之类的东西
alias :with_zipcode, :has_zipcode

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

谢谢!

3 个答案:

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