Rails 4:验证自定义模型验证器中的重复项

时间:2016-01-25 21:48:50

标签: validation ruby-on-rails-4 activerecord

我有这个型号:

Ofert.rb

class Ofert < ActiveRecord::Base
has_many :shipping_fees
end

Shipping_fee.rb

class ShippingFee < ActiveRecord::Base
    belongs_to :ofert
end

ShippingFee有一个属性city。我想验证用户是否为同一个Ofert

输入了同一个城市

我已经让它像这样工作:

class ShippingFee < ActiveRecord::Base
    belongs_to :ofert
    validate :not_reapeated_cities

    def not_reapeated_cities
        ofert = Ofert.find self.ofert_id
        ofert.shipping_fees.each do |shipping_fee|
            errors.add(:city, "has been already added") if shipping_fee.city == self.city
            break if not errors.empty?
        end
    end
end

但是我认为有更好的方法,我想尽可能优化应用程序。当有很多ShippingFee时,它对性能没有帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用scope验证的uniqueness选项,如下所示

  validates_uniqueness_of :city, scope: :ofert_id

您还需要在unique index表格中添加shipping_fees,如下所示

add_index(:shipping_fees, [:city, :ofert_id], unique: true)