Ruby on rails 未正确验证值对象枚举

Ruby on rails 未正确验证值对象枚举,ruby-on-rails,ruby,validation,value-objects,Ruby On Rails,Ruby,Validation,Value Objects,我的项目中有几个枚举可以跨多个模型重用,其中一些有自己的内部逻辑,因此我将它们实现为值对象(如第5节所述),但我似乎无法使用ActiveRecord验证。最简单的例子是带有Gender值对象的Person模型 迁移: # db/migrate/###_create_people.rb class CreatePeople < ActiveRecord::Migration[5.2] def change create_table :people do |t| t.s

我的项目中有几个枚举可以跨多个模型重用,其中一些有自己的内部逻辑,因此我将它们实现为值对象(如第5节所述),但我似乎无法使用ActiveRecord验证。最简单的例子是带有
Gender
值对象的
Person
模型

迁移:

# 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

唯一的问题是,尽管将模型设置为验证性别属性的存在,但它允许使用
gender
nil
保存
Person
。我不确定这是为什么,所以我不确定从哪里开始尝试解决问题。

在您的模型文件
person.rb中:

枚举性别:枚举::性别::
GENDERS

但是,在您的模型文件
gender.rb
中: 常数为
GENDER

person.rb中的行更改为:

枚举性别:枚举::性别::性别

而不是

枚举性别:枚举::性别::性别


所以我自己想出来了。非常感谢benjessop,他的建议没有奏效,但确实让我走上了正确的思路

validates :gender, numericality: { integer_only: true, greater_than_or_equal_to: 0, less_than: Enums::Gender::GENDERS.count }
我可能会编写一个自定义验证,将该逻辑实现到几个不同的值对象枚举中。再次感谢那些试图提供帮助的人。

我的代码中不存在打字错误(我在原始帖子中已修复),这只是我在这里提供示例时犯的一个错误。所以,虽然你说的没错,但这并不是导致验证问题的原因。
# 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
validates :gender, numericality: { integer_only: true, greater_than_or_equal_to: 0, less_than: Enums::Gender::GENDERS.count }