2016-08-20 2 views
0

Мне тяжело пытаться избежать дубликатов в моей базе данных, и мне очень интересно узнать, действительно ли я делаю это правильно. В приведенном ниже примере мои технические отчеты работают отлично. Таким образом, в техническом отчете нет повторяющихся узлов, даже если я попытаюсь создать дубликат вручную.Rails validates_uniqueness_of, похоже, не работает для меня

Однако я не могу сказать то же самое для вузов вузов. Когда я дважды импортирую тот же самый файл (содержащий данные), я получаю дубликаты Vulns для одного и того же IP-адреса, если полагаю, что это не должно произойти.

Так вот две модели, которые у меня есть:

#app/models/node.rb 
class Node < ActiveRecord::Base 
    validates_uniqueness_of :technical_report_id, :scope => :ip  
    has_many :vulns, dependent: :destroy 
end 

.

#app/models/vuln.rb 
class Vuln < ActiveRecord::Base 
    validates_uniqueness_of :node_id, :scope => [:master_finding_id, :vuln_finding_id, :additional_output, :port] 

    belongs_to :node 
    belongs_to :master_finding 
    belongs_to :vuln_finding 
end 

Однако, когда я иду на импорт данных, я все еще нахожусь с дубликатами в таблице Vuln. Я также использовал rails c, чтобы проверить это.

irb(main):012:0> Vuln.where(node_id: 12).pluck(:master_finding_id, :additional_output, :vuln_finding_id).length 
    (0.4ms) SELECT `vulns`.`master_finding_id`, `vulns`.`additional_output`, `vulns`.`vuln_finding_id` FROM `vulns` WHERE `vulns`.`node_id` = 12 
=> 2 

Когда я иду звонить .uniq это показывает, что есть только одна запись.

irb(main):013:0> Vuln.where(node_id: 12).pluck(:master_finding_id, :additional_output, :vuln_finding_id).uniq.length 
    (0.5ms) SELECT `vulns`.`master_finding_id`, `vulns`.`additional_output`, `vulns`.`vuln_finding_id` FROM `vulns` WHERE `vulns`.`node_id` = 12 
=> 1 

Кто-нибудь знает, что я здесь делаю неправильно? Я не уверен, почему это работает для одной модели, а не для другой. Если я попытаюсь создать две из тех же самых записей Vuln от CLI rails c, она откатывается назад, как должна, но не тогда, когда она создана иначе.

EDIT

Похоже, моя проблема с ActiveRecord-импорта вместо этого. Я не уверен, почему, но он импортирует узлы просто отлично, но он вызывает «Class Create Many Without Validations or Callbacks», когда он идет на импорт vulns. Угадайте, потому что есть намного больше данных или что-то еще. Наверное, сейчас я это выяснил. Возможно, мне просто нужно написать быстрый метод для проверки уникальности вручную, так как я не хочу избавляться от массового импорта драгоценного камня.

+0

Вы видите эту вики: https://github.com/zdennis/activerecord-import/wiki/On-Duplicate-Key-Update, если это используется – Deep

+0

Хмм, я не сталкивался с этим, так как это в ручном режиме. Очень ценим, хотя! Идущий посмотреть на это больше. – LewlSauce

ответ

1

validates_uniqueness_of не может обеспечить уникальность в каждом случае. В пределах docs вы можете увидеть пример состояния гонки в рамках такого рода проверки. Если это действительно необходимо, вы также должны использовать ограничение uniq на уровне базы данных.

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