Если ваша модель действительно «отвечает» за константы, вы должны вставить их туда. Вы можете создавать методы класса для доступа к ним, не создавая новый экземпляр объекта:
class Card < ActiveRecord::Base
def self.colours
['white', 'blue']
end
end
# accessible like this
Card.colours
Кроме того, вы можете создать переменные класса и метод доступа. Это, однако, не рекомендуется, поскольку переменные класса могут вызывать удивление при наследовании и в многопоточных средах.
class Card < ActiveRecord::Base
@@colours = ['white', 'blue']
cattr_reader :colours
end
# accessible the same as above
Две вышеупомянутые опции позволяют вам изменять возвращаемый массив при каждом вызове метода доступа, если это необходимо. Если у вас действительно истинная неизменная константа, вы также можете определить ее в классе модели:
class Card < ActiveRecord::Base
COLOURS = ['white', 'blue'].freeze
end
# accessible as
Card::COLOURS
Вы также можете создавать глобальные константы, которые доступны из любого места в инициализаторе, как в следующем примере. Это, вероятно, лучшее место, если ваши цвета действительно глобальны и используются в нескольких контекстах модели.
# put this into config/initializers/my_constants.rb
COLOURS = ['white', 'blue'].freeze
Примечание: когда мы определяем константы выше, часто мы хотим freeze
массив. Это препятствует тому, чтобы другой код позже (непреднамеренно) изменил массив, например, добавление нового элемента. Как только объект заморожен, он больше не может быть изменен.