2016-01-25 4 views
1

У меня есть эти модели:Rails 4: проверка дубликатов в пользовательской модели валидатора

Ofert.rb

class Ofert < ActiveRecord::Base 
has_many :shipping_fees 
end 

Shipping_fee.rb
class ShippingFee < ActiveRecord::Base 
    belongs_to :ofert 
end 

имеет атрибут 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 

Однако я думаю, что есть лучший способ сделать это, я хочу оптимизируйте приложение как можно больше. И когда есть много , это не будет полезно для производительности.

ответ

1

Вы можете использовать scope возможность проверки uniqueness, как показано ниже

validates_uniqueness_of :city, scope: :ofert_id 

Кроме того, необходимо добавить unique index к shipping_fees таблице, как показано ниже

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

работал прекрасно, вы молодцы! спасибо – SsouLlesS

+0

Привет У меня вопрос, нужно ли 'add_index' строго необходимо? – SsouLlesS

+1

@SsouLlesS Да, ради параллелизма и целостности, вам нужно. Для получения дополнительной информации прочтите это http://apidock.com/rails/v4.2.1/ActiveRecord/Validations/ClassMethods/validates_uniqueness_of – Pavan

Смежные вопросы