【问题标题】:ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entryActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry
【发布时间】:2019-06-09 01:00:07
【问题描述】:

尝试保存具有相同 URL 和 user_id 的条目时出现以下错误。这里的问题是我需要添加它,但需要使用不同的提供程序(Yext、Synup 或 Default)(查看 ActiveRecordError 的最后)。

下面,我将验证粘贴到我的控制器和表索引中,但我不确定是否

1) 我需要删除当前索引并使用 provider 列添加一个新索引

与/或

2) 更改控制器中的验证以允许保存具有相同 user_id、url 但提供者不同的记录

感谢您的回答!

ActiveRecord 错误:

#<ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry '1070078-https://www.cylex.ca/company/the-painted-window-wedding-' for key 'index_business_profiles_on_user_id_and_url': INSERT INTO `business_profiles` (`local_seo_site_id`, `url`, `success_at`, `company_location_id`, `provider`, `user_id`, `created_at`, `updated_at`) VALUES (136, 'https://www.cylex.ca/company/the-painted-window-wedding-venue-24052526.html', '2019-06-08 07:36:36', 1051892, 'synup', 1070078, '2019-06-08 07:36:36', '2019-06-08 07:36:36')>

验证:

validates :user_id, :local_seo_site_id, :url, presence: true
  validates_uniqueness_of :url, scope: [:user_id, :provider], case_sensitive: false, if: :url_changed?
  # vendor can't add same directory twice to same account
  validates_uniqueness_of :local_seo_site_id, scope: [:user_id, :admin_id, :company_location_id], on: :create, if: :added_by_vendor?
  validates :url, :url => true, if: :url_changed?

表格索引:

add_index :business_profiles, [:user_id, :url], unique: true

【问题讨论】:

  • 第一个选项,只需删除当前索引并创建另一个。我认为第二个选项不适用于这种情况

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


【解决方案1】:

控制器验证强制使用唯一的三元组(url、user_id、provider), 而索引强制执行一个唯一的对 (user_id,url)。

如果您想使用与现有记录相同的 user_id 和 url 创建一条记录,但使用另一个提供程序,则从数据库中删除当前唯一索引并为三元组添加一个新的唯一索引应该可以解决问题。

add_index :business_profiles, [:user_id, :url, :provider], unique: true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2016-09-13
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多