Можете ли вы использовать псевдоним в Rails?

Скажем, у меня есть эта сфера:

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

и я хочу эквивалентную сферу

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

Есть ли способ для псевдонима одной области видимости другому? Например что-то вроде

alias :with_zipcode, :has_zipcode

PS Я знаю, что это надуманный и нереальный пример, просто интересно узнать, возможно ли это!

Спасибо!

2 ответа

Решение

Да, ты можешь. Просто помните, что области видимости - это методы класса, поэтому вам необходимо создать псевдоним в контексте класса:

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

  # or with Ruby 1.9+
  singleton_class.send(:alias_method, :has_zipcode, :with_zipcode)
end

Альтернативный способ определения псевдонима для метода класса, который я лично считаю более понятным:

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

  class << self
    alias has_zipcode with_zipcode
  end
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) вероятно, менее двусмысленно, но просто хотел предупредить другой вариант.

Другие вопросы по тегам