Rails проверяет полиморфный атрибут ассоциированной модели - PullRequest
0 голосов
/ 14 мая 2018

В моем приложении Rails 5.2 у меня есть полиморфная модель Vehicle типа Car, Bike, Jeep и т. Д., Которая имеет принадлежность к ассоциации 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'",
        }
    }

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я не знаю, как лучше, но я поделюсь тем, что я сделал в одном из моих проектов:

Я решил расширить 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

0 голосов
/ 14 мая 2018

Вы должны поставить проверку на идентификатор, а не на отображаемое имя, так как вам придется реорганизовать свой код, если вы когда-нибудь решите изменить отображаемое имя.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...