Можете ли вы присвоить область в Rails?
Скажем, у меня есть эта область:
scope :with_zipcode, lambda { |zip| where(zipcode: zip) }
и я хочу эквивалентную область действия
scope :has_zipcode, lambda { |zip| where(zipcode: zip) }
существует ли способ слияния одного объекта с другим? Например, что-то вроде
alias :with_zipcode, :has_zipcode
P.S. Я знаю, что это надуманный и нереалистичный пример, просто любопытно узнать, возможно ли это!
Спасибо!
Ответы
Ответ 1
Да, ты можешь. Просто помните, что области видимости - это методы класса, поэтому вам необходимо использовать псевдоним в контексте класса:
class User < ActiveRecord::Base
scope :with_zipcode, lambda { |zip| where(zipcode: zip) }
singleton_class.send(:alias_method, :has_zipcode, :with_zipcode)
end
Ответ 2
Другое решение - вызвать одну область из другой.
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)
, вероятно, менее двусмысленно, но просто хотелось предупредить о другом варианте.
Ответ 3
Альтернативный способ определения псевдонима для метода класса, который я нахожу немного более понятным:
class User < ActiveRecord::Base
scope :with_zipcode, lambda { |zip| where(zipcode: zip) }
class << self
alias has_zipcode with_zipcode
end
end