Можете ли вы присвоить область в 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