begin require "bundler/inline" rescue LoadError => e $stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler" raise e end gemfile(true) do source "https://rubygems.org" gem "rails" gem "pg" end require "active_record" require "action_controller/railtie" ActiveRecord::Base.establish_connection(adapter: "postgresql", database: "uniq-db-test", pool: 100) ActiveRecord::Base.logger = Logger.new(STDOUT) ActiveRecord::Schema.define do enable_extension "plpgsql" create_table "time_tracks", force: :cascade do |t| t.bigint "user_id", null: false t.bigint "task_id", null: false t.integer "hours", null: false t.date "date", null: false t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end create_table "users", force: :cascade do |t| t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false end add_foreign_key "time_tracks", "users" end class User < ActiveRecord::Base has_many :time_tracks end class TimeTrack < ActiveRecord::Base validates :task_id, uniqueness: { scope: %i[date user_id] } end # ------------- TimeTrack.delete_all User.delete_all threads = [] wait_for_it = true user = User.create 40.times do date = Date.new(2020, 1, rand(1..4)) threads << Thread.new(date) do true while wait_for_it begin user.time_tracks.create_with(hours: 10).find_or_create_by!(date: date, task_id: 1) rescue ActiveRecord::RecordInvalid puts 'RecordInvalid rescued!' end end end wait_for_it = false threads.each(&:join) not_unique_count = TimeTrack.from( TimeTrack.group(:date, :user_id).having('COUNT(*) > 1').select(:date, :user_id) ).select('COUNT(subquery.date) AS not_unique').to_a.first.not_unique puts "\nFound #{not_unique_count} not unique tracks"