我的项目中有几个枚举,这些枚举将在多个模型中重用,并且其中的几个将具有自己的内部逻辑,因此我将它们实现为值对象(如here @第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
。我不确定为什么会这样,所以我不确定从哪里开始尝试解决问题。
答案 0 :(得分:1)
所以我自己弄清楚了。非常感谢benjessop的建议没有用,但确实使我走上了正确的思路。
validates :gender, numericality: { integer_only: true, greater_than_or_equal_to: 0, less_than: Enums::Gender::GENDERS.count }
我可能会编写一个自定义验证,以将该逻辑实现到几个不同的值对象枚举中。再次感谢那些试图提供帮助的人。
答案 1 :(得分:0)
在模型文件person.rb
中:
枚举性别:枚举::性别::
GENDERS
但是,在您的模型文件gender.rb
中:
常数为GENDER
将person.rb
中的行更改为:
枚举性别:Enums :: Gender :: GENDER
代替
枚举性别:Enums :: Gender :: GENDERS