У меня была похожая проблема.У меня есть таблица с индексом, использующая несколько полей вверх, по которым таблица сортируется
в db / migrate
class CreateDids < ActiveRecord::Migration
def change
create_table :dids do |t|
t.string :lada, null: false, limit: 3
t.string :pre_did, null: false, limit: 4
t.string :did, null: false, limit: 7
t.boolean :uso_interno_ns, default: false, null: false
t.timestamps
t.integer :lock_version, null: false, default: 0
t.index [:lada, :pre_did, :did], unique: true
end
end
end
Теперь,чтобы проверить уникальное сочетание полей в models / did.rb Я написал:
validates :lada, presence: true, length: { within: 1..3 }, numericality: { only_integer: true}
validates :pre_did, presence: true, length: { within: 1..4 }, numericality: { only_integer: true}
validates :did, presence: true, length: { within: 4..7 }, numericality: { only_integer: true}
validate do
errors.add :base,I18n.t('dids.numero_menor_10') unless 10 == ( self.lada + self.pre_did + self.did ).size if self.lada and self.pre_did and self.did
end
Но он не подтвердил дублированное сочетание полей (lada+ pre_did + did), поэтому в models / did.rb также написано:
def save
begin
super
rescue ActiveRecord::RecordNotUnique => e
errors.add(:base,I18n.t('dids.telefono_duplicado'))
false
end
end
def update( x )
begin
super x
rescue ActiveRecord::RecordNotUnique => e
errors.add(:base,I18n.t('dids.telefono_duplicado'))
false
end
end
Теперь в моем случае, если я не вернусь false после спасения это не работает.