1

我的项目中有一些枚举将在多个模型中重用,其中一些将具有自己的内部逻辑,因此我已将它们实现为值对象(如此@第 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

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

4

2 回答 2

1

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

validates :gender, numericality: { integer_only: true, greater_than_or_equal_to: 0, less_than: Enums::Gender::GENDERS.count }

我可能会编写一个自定义验证来将该逻辑实现到几个不同的值对象枚举中。再次感谢那些试图提供帮助的人。

于 2020-07-11T18:57:17.613 回答
0

在您的模型文件中person.rb

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

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

将行更改person.rb为:

枚举性别:Enums::Gender::GENDER

代替

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

于 2020-07-11T16:48:34.670 回答