Add unique constraint for keeping tags unique on a per-account basis

This commit is contained in:
Jorge Manrubia
2025-04-07 11:36:34 +02:00
parent 598d933565
commit 16e8041524
4 changed files with 71 additions and 56 deletions
@@ -0,0 +1,5 @@
class MakeTagTitlesUniquePerAccount < ActiveRecord::Migration[8.1]
def change
add_index :tags, [ :account_id, :title ], unique: true
end
end
Generated
+2 -1
View File
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.1].define(version: 2025_04_04_133310) do
ActiveRecord::Schema[8.1].define(version: 2025_04_07_093421) do
create_table "accesses", force: :cascade do |t|
t.integer "bucket_id", null: false
t.datetime "created_at", null: false
@@ -287,6 +287,7 @@ ActiveRecord::Schema[8.1].define(version: 2025_04_04_133310) do
t.datetime "created_at", null: false
t.string "title"
t.datetime "updated_at", null: false
t.index ["account_id", "title"], name: "index_tags_on_account_id_and_title", unique: true
t.index ["account_id"], name: "index_tags_on_account_id"
end
+64 -47
View File
@@ -50,26 +50,6 @@ columns:
default_function:
collation:
comment:
- &9 !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: updated_at
cast_type: *3
sql_type_metadata: *4
'null': false
default:
default_function:
collation:
comment:
- &30 !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: user_id
cast_type: *1
sql_type_metadata: *2
'null': false
default:
default_function:
collation:
comment:
- !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: involvement
@@ -90,6 +70,26 @@ columns:
default_function:
collation:
comment:
- &9 !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: updated_at
cast_type: *3
sql_type_metadata: *4
'null': false
default:
default_function:
collation:
comment:
- &30 !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: user_id
cast_type: *1
sql_type_metadata: *2
'null': false
default:
default_function:
collation:
comment:
accounts:
- *5
- *6
@@ -468,6 +468,16 @@ columns:
default_function:
collation:
comment:
- !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: last_active_at
cast_type: *3
sql_type_metadata: *4
'null': true
default:
default_function:
collation:
comment:
- !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: stage_id
@@ -499,16 +509,6 @@ columns:
collation:
comment:
- *9
- !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: last_active_at
cast_type: *3
sql_type_metadata: *4
'null': false
default:
default_function:
collation:
comment:
buckets:
- *5
- &32 !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
@@ -760,6 +760,7 @@ columns:
default_function:
collation:
comment:
- *6
- !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: label
@@ -770,12 +771,21 @@ columns:
default_function:
collation:
comment:
- *6
- *9
pops:
- *5
- *25
- *6
- !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: reason
cast_type: *7
sql_type_metadata: *8
'null': false
default:
default_function:
collation:
comment:
- *9
- !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
@@ -787,16 +797,6 @@ columns:
default_function:
collation:
comment:
- !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
auto_increment:
name: reason
cast_type: *7
sql_type_metadata: *8
'null': false
default:
default_function:
collation:
comment:
reactions:
- *5
- !ruby/object:ActiveRecord::ConnectionAdapters::SQLite3::Column
@@ -1354,11 +1354,10 @@ indexes:
bubbles:
- !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition
table: bubbles
name: index_bubbles_on_last_active_at_and_status
name: index_bubbles_on_stage_id
unique: false
columns:
- last_active_at
- status
- stage_id
lengths: {}
orders: {}
opclasses: {}
@@ -1371,10 +1370,11 @@ indexes:
valid: true
- !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition
table: bubbles
name: index_bubbles_on_stage_id
name: index_bubbles_on_last_active_at_and_status
unique: false
columns:
- stage_id
- last_active_at
- status
lengths: {}
orders: {}
opclasses: {}
@@ -1991,6 +1991,23 @@ indexes:
comment:
valid: true
tags:
- !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition
table: tags
name: index_tags_on_account_id_and_title
unique: true
columns:
- account_id
- title
lengths: {}
orders: {}
opclasses: {}
where:
type:
using:
include:
nulls_not_distinct:
comment:
valid: true
- !ruby/object:ActiveRecord::ConnectionAdapters::IndexDefinition
table: tags
name: index_tags_on_account_id
@@ -2123,4 +2140,4 @@ indexes:
nulls_not_distinct:
comment:
valid: true
version: 20250404133310
version: 20250407093421
-8
View File
@@ -16,12 +16,4 @@ class Bubble::TaggableTest < ActiveSupport::TestCase
@bubble.toggle_tag_with "ruby"
end
end
test "ignore case when toggling tags" do
@bubble.toggle_tag_with "ruby"
assert_difference -> { @bubble.tags.count }, -1 do
@bubble.toggle_tag_with "Ruby"
end
end
end