Мне тяжело пытаться избежать дубликатов в моей базе данных, и мне очень интересно узнать, действительно ли я делаю это правильно. В приведенном ниже примере мои технические отчеты работают отлично. Таким образом, в техническом отчете нет повторяющихся узлов, даже если я попытаюсь создать дубликат вручную.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. Угадайте, потому что есть намного больше данных или что-то еще. Наверное, сейчас я это выяснил. Возможно, мне просто нужно написать быстрый метод для проверки уникальности вручную, так как я не хочу избавляться от массового импорта драгоценного камня.
Вы видите эту вики: https://github.com/zdennis/activerecord-import/wiki/On-Duplicate-Key-Update, если это используется – Deep
Хмм, я не сталкивался с этим, так как это в ручном режиме. Очень ценим, хотя! Идущий посмотреть на это больше. – LewlSauce