Rails验证多态关联模型属性

时间:2018-05-14 04:43:24

标签: ruby-on-rails activerecord

在我的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'",
        }
    }

3 个答案:

答案 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的观点。我要在讨论中添加的一小件事是,这实际上不是多态关联,因为多态关联是关于“在一个关联上一个模型可以属于多个其他模型”。这是通过typeid字段(例如imageable_idimageable_type)的组合来完成的。参见文档here

它并没有真正影响您对问题的回答,但我只想提一提,因为多态关联使我永远不知所措,我想指出这一区别可能会有所帮助。