Как я могу обрабатывать перечисления в рельсах? Я искал это, но не нашел никаких чистых решений. До сих пор я придумал, в том числе, озабоченность, приведенную ниже, на моделях, которые используют interactive_type_id. Это мой внешний ключ для моей таблицы перечислений в базе данных. Используя этот подход, я не должен использовать идентификаторы во всем моем коде, но при сохранении объекта, который относится к interact_type я могу сказатьКак обращаться с рельсами?
myobject.interaction_type = :file_download
Это может затем сохраняться в базе данных с правильным идентификатором, поскольку концерн (см. ниже приведенную ниже информацию о моделях, которые используют перечисление) вернет правильный идентификатор.
module InteractionTypeEnum
extend ActiveSupport::Concern
included do
INTERACTION_TYPE = { file_download: 1, email: 2, telesales: 3, registration: 4, enrolment: 5 }
end
def interaction_type
INTERACTION_TYPE.key(read_attribute(:interaction_type_id)).to_s.gsub('_',' ').capitalize
end
def interaction_type=(s)
write_attribute(:interaction_type_id, INTERACTION_TYPE[s])
end
end
Это просто тяжело. Должен быть более простой/чистый способ. Теперь, пытаясь написать тесты для этого, он становится еще более грязным.
Большинство причин, по которым я хочу перечислять в коде и базе данных, - это производительность (код) и отчетность (база данных).
Любая помощь приветствуется. Благодарю.
Хорошее решение, но, допустим, теперь вы сохраняете пользователя в базе данных и хотите получить доступ к полу пользователя через задний конец. Вы говорите, что это должно храниться как строка в базе данных - мужчина, женщина. Что произойдет, если ваш набор перечислений увеличится до 10 пунктов и после этого не изменится. Не хотите ли вы эту информацию в таблице в базе данных? В некоторых случаях вам также может понадобиться расширение перечисления для включения другой информации, такой как rank/order or description. Я вижу, как это полезно и чисто, но это может быть немного ограниченным. –
Он хранится как целое число в базе данных, и есть гораздо больше функциональности, чем то, что я скопировал здесь (например, вы можете добавить расширенную информацию в перечисление, как вы описываете.) Я бы порекомендовал вам пойти, если бы только узнать больше об этом и посмотреть, подходит ли оно для ваших целей; Я использовал его в нескольких проектах и никогда не испытывал проблем. Но, конечно, это не единственное решение (я уверен, что есть и другие переименованные камни, или вы можете катить свой собственный, как и другой ответ), и я не слишком сильно инвестировал в него, другие предложения тоже будут работать. – GMA
Я проверил github. Выглядит очень хорошо, но похоже, что он не поддерживает рельсы. 4. Когда я включаю config.extend_classes = [ActiveRecord :: Base] в код и пытаюсь запустить консоль rails, я получаю /Users/ryanme/.rvm/gems/ruby [email protected]_rails_4_0/gems/activerecord-4.0.2/lib/active_record/dynamic_matchers.rb: 22: в 'method_missing ': undefined method' class_inheritable_accessor' для ActiveRecord :: Base: Class (NoMethodError) --- ---- Из того, что я прочитал, class_inheritable_accessor устарел. –