我对Rails 3中的自定义验证选项感到有些困惑,我希望有人可以指出我可以帮助解决当前问题的资源。
我目前有3个模型,vehicle
,trim
和model_year
。他们看起来如下:
class Vehicle < ActiveRecord::Base
attr_accessible :make_id, :model_id, :trim_id, :model_year_id
belongs_to :trim
belongs_to :model_year
end
class ModelYear < ActiveRecord::Base
attr_accessible :value
has_many :model_year_trims
has_many :trims, :through => :model_year_trims
end
class Trim < ActiveRecord::Base
attr_accessible :value, :model_id
has_many :vehicles
has_many :model_year_trims
has_many :model_years, :through => :model_year_trims
end
我的疑问是这样的 - 当我创建车辆时,如何确保所选择的model_year对修剪有效(反之亦然)?
答案 0 :(得分:60)
您可以使用自定义验证方法,如here所述:
class Vehicle < ActiveRecord::Base
validate :model_year_valid_for_trim
def model_year_valid_for_trim
if #some validation code for model year and trim
errors.add(:model_years, "some error")
end
end
end
答案 1 :(得分:25)
您可以使用ActiveModel::Validator
类,如下所示:
class VehicleValidator < ActiveModel::Validator
def validate(record)
return true if # custom model_year and trip logic
record.errors[:base] << # error message
end
end
class Vehicle < ActiveRecord::Base
attr_accessible :make_id, :model_id, :trim_id, :model_year_id
belongs_to :trim
belongs_to :model_year
include ActiveModel::Validations
validates_with VehicleValidator
end