Можете ли вы использовать псевдоним в 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)
вероятно, менее двусмысленно, но просто хотел предупредить другой вариант.