在我的Rails 5.2应用程序中,我有一个类型为Car,Bike,Jeep等类型的多态模型车辆,它有belongs_to association vehicle_type。我想验证关联的记录属性display_name。以下代码片段完成了这项工作,但我想知道更好的方法。
class Car < Vehicle
validates :vehicle_type,
:inclusion => {
:in => [VehicleType.find_by(display_name: 'four wheeler')],
:message => "A Car can only be of vehicle_type 'four wheeler'",
}
}
答案 0 :(得分:0)
您应该将验证放在id而不是显示名称上,因为如果您决定更改显示名称,则必须重构代码。
class VehiculeType
FOUR_WHEELER = 1 (id of the four_wheeler type)
end
class Car < Vehicule
validate :validate_vehicule_type
private
def validate_vehicule_type
errors.add(:vehicule, "A Car can only be of vehicle_type 'four wheeler'") unless vehicule_type_id == VehiculeType::FOUR_WHEELER
end
end
答案 1 :(得分:0)
我不知道什么是最好的方式,但我会分享我在其中一个项目中所做的事情:
我决定扩展ActiveModel::Validator
并为我的多态关联创建自己的验证
在你的情况下
class CarValidator < ActiveModel::Validator
def validate_vehicle_type(record)
# where did you save the veicle type associatuon?
unless VehicleType.find_by(display_name: record.veicle_type).exists?
record.errors.add :veicle_type, "This veicle type does not exist"
end
end
然后validates with CarValidator
答案 2 :(得分:0)
我同意Mathieu Larouche的观点。我要在讨论中添加的一小件事是,这实际上不是多态关联,因为多态关联是关于“在一个关联上一个模型可以属于多个其他模型”。这是通过type
和id
字段(例如imageable_id
和imageable_type
)的组合来完成的。参见文档here。
它并没有真正影响您对问题的回答,但我只想提一提,因为多态关联使我永远不知所措,我想指出这一区别可能会有所帮助。