FIX: ensure image tracking custom fields have no dupes

FIX: ensure image tracking custom fields have no dupes

All these columns must never include duplicates for a single post otherwise code breaks. All are defined in post.rb in the top in constants but we usually prefer not to ref constants in case they change and migration becomes inconsistent.

diff --git a/db/migrate/20190424065841_add_post_image_indexes.rb b/db/migrate/20190424065841_add_post_image_indexes.rb
new file mode 100644
index 0000000..eb1e4aa0
--- /dev/null
+++ b/db/migrate/20190424065841_add_post_image_indexes.rb
@@ -0,0 +1,24 @@
+class AddPostImageIndexes < ActiveRecord::Migration[5.2]
+  def change
+
+    %w{
+      large_images
+      broken_images
+      downloaded_images
+    }.each do |field|
+
+      execute <<~SQL
+        DELETE FROM post_custom_fields f
+        WHERE name = '#{field}' AND id > (
+          SELECT MIN(f2.id) FROM post_custom_fields f2
+            WHERE f2.post_id = f.post_id AND f2.name = f.name
+        )
+      SQL
+
+      add_index :post_custom_fields, [:post_id],
+        name: "post_custom_field_#{field}_idx",
+        unique: true,
+        where: "name = '#{field}'"
+    end
+  end
+end

GitHub sha: 8d697bbb

2 Likes