Перечисление объекта значения не проверяется должным образом - PullRequest
1 голос
/ 11 июля 2020

У меня есть несколько перечислений в моем проекте, которые будут повторно использоваться в нескольких моделях, а некоторые из них будут иметь свои собственные внутренние 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. Я не уверен, почему это так, поэтому не знаю, с чего начать попытки решить проблему.

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Вот и разобрался сам. Большое спасибо бенджесопу, чье предложение не сработало, но заставило меня задуматься. перечисления объектов. Еще раз спасибо тем, кто пытался помочь.

0 голосов
/ 11 июля 2020

В вашем файле модели person.rb:

enum пол: Enums :: Gender :: GENDERS

Но, в вашем файле модели gender.rb : константа GENDER

Измените строку в person.rb на:

enum пол: Enums :: Gender :: GENDER

вместо

enum пол: Enums :: Gender :: GENDERS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...