У меня есть несколько перечислений в моем проекте, которые будут повторно использоваться в нескольких моделях, а некоторые из них будут иметь свои собственные внутренние logi c, поэтому я реализовал их как объекты значений (как описано здесь @ section 5), но я не могу заставить ActiveRecord работать с ними. Простейшим примером является модель Person
с объектом значения Gender
.
Миграция:
# db/migrate/###_create_people.rb
class CreatePeople < ActiveRecord::Migration[5.2]
def change
create_table :people do |t|
t.string :name
t.integer :age
t.integer :gender
end
end
end
Модель:
# app/models/person.rb
class Person < ApplicationRecord
validates :gender, presence: true
enum gender: Enums::Gender::GENDERS
def gender
@gender ||= Enums::Gender.new(read_attribute(:gender))
end
end
Объект значения:
# app/models/enums/gender.rb
module Enums
class Gender
GENDERS = %w(female male other).freeze
def initialize(gender)
@gender = gender
end
def eql?(other)
to_s.eql?(other.to_s)
end
def to_s
@gender.to_s
end
end
end
Единственная проблема заключается в том, что, несмотря на то, что модель настроена на проверку наличия атрибута пола, она позволяет сохранять Person
с gender
из nil
. Я не уверен, почему это так, поэтому не знаю, с чего начать попытки решить проблему.