diff --git a/db/migrate/20160225232049_link_share_visibilities_with_user.rb b/db/migrate/20160225232049_link_share_visibilities_with_user.rb new file mode 100644 index 0000000000000000000000000000000000000000..1528c9aed406e3a7becf3380286baaf4731d1f84 --- /dev/null +++ b/db/migrate/20160225232049_link_share_visibilities_with_user.rb @@ -0,0 +1,65 @@ +class LinkShareVisibilitiesWithUser < ActiveRecord::Migration + def up + cleanup_deleted_share_visibilities + + remove_columns :share_visibilities, :created_at, :updated_at + add_column :share_visibilities, :user_id, :integer + + ShareVisibility.joins("INNER JOIN contacts ON share_visibilities.contact_id = contacts.id") + .update_all("share_visibilities.user_id = contacts.user_id") + + remove_foreign_key :share_visibilities, name: :post_visibilities_contact_id_fk + + remove_index :share_visibilities, name: :index_post_visibilities_on_contact_id + remove_index :share_visibilities, name: :shareable_and_contact_id + remove_index :share_visibilities, name: :shareable_and_hidden_and_contact_id + + remove_column :share_visibilities, :contact_id + change_column :share_visibilities, :user_id, :integer, null: false + + ShareVisibility.joins("LEFT OUTER JOIN users ON users.id = share_visibilities.user_id") + .delete_all("users.id is NULL") + + add_index :share_visibilities, :user_id + add_index :share_visibilities, %i(shareable_id shareable_type user_id), name: :shareable_and_user_id + add_index :share_visibilities, %i(shareable_id shareable_type hidden user_id), + name: :shareable_and_hidden_and_user_id + + add_foreign_key :share_visibilities, :users, name: :share_visibilities_user_id_fk, on_delete: :cascade + end + + def down + add_column :share_visibilities, :contact_id, :integer + + ShareVisibility.joins("INNER JOIN contacts ON share_visibilities.user_id = contacts.user_id") + .update_all("share_visibilities.contact_id = contacts.id") + + remove_foreign_key :share_visibilities, name: :share_visibilities_user_id_fk + + remove_index :share_visibilities, :user_id + remove_index :share_visibilities, name: :shareable_and_user_id + remove_index :share_visibilities, name: :shareable_and_hidden_and_user_id + + remove_column :share_visibilities, :user_id + change_column :share_visibilities, :contact_id, :integer, null: false + + add_index :share_visibilities, :contact_id, name: :index_post_visibilities_on_contact_id + add_index :share_visibilities, %i(shareable_id shareable_type contact_id), name: :shareable_and_contact_id + add_index :share_visibilities, %i(shareable_id shareable_type hidden contact_id), + name: :shareable_and_hidden_and_contact_id + + add_foreign_key :share_visibilities, :contacts, name: :post_visibilities_contact_id_fk, on_delete: :cascade + + add_column :share_visibilities, :created_at, :datetime + add_column :share_visibilities, :updated_at, :datetime + end + + private + + def cleanup_deleted_share_visibilities + ShareVisibility.joins("LEFT OUTER JOIN posts ON posts.id = share_visibilities.shareable_id") + .where(shareable_type: "Post").delete_all("posts.id is NULL") + ShareVisibility.joins("LEFT OUTER JOIN photos ON photos.id = share_visibilities.shareable_id") + .where(shareable_type: "Photo").delete_all("photos.id is NULL") + end +end diff --git a/db/schema.rb b/db/schema.rb index 5214e27e449e6ff012c0b3074047ccd756b196f1..eb62fdfacbf552738c09e1a2825d5d237cc81394 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20151210213023) do +ActiveRecord::Schema.define(version: 20160225232049) do create_table "account_deletions", force: :cascade do |t| t.string "diaspora_handle", limit: 255 @@ -542,18 +542,16 @@ ActiveRecord::Schema.define(version: 20151210213023) do add_index "services", ["user_id"], name: "index_services_on_user_id", using: :btree create_table "share_visibilities", force: :cascade do |t| - t.integer "shareable_id", limit: 4, null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.boolean "hidden", default: false, null: false - t.integer "contact_id", limit: 4, null: false - t.string "shareable_type", limit: 60, default: "Post", null: false + t.integer "shareable_id", limit: 4, null: false + t.boolean "hidden", default: false, null: false + t.string "shareable_type", limit: 60, default: "Post", null: false + t.integer "user_id", limit: 4, null: false end - add_index "share_visibilities", ["contact_id"], name: "index_post_visibilities_on_contact_id", using: :btree - add_index "share_visibilities", ["shareable_id", "shareable_type", "contact_id"], name: "shareable_and_contact_id", using: :btree - add_index "share_visibilities", ["shareable_id", "shareable_type", "hidden", "contact_id"], name: "shareable_and_hidden_and_contact_id", using: :btree + add_index "share_visibilities", ["shareable_id", "shareable_type", "hidden", "user_id"], name: "shareable_and_hidden_and_user_id", using: :btree + add_index "share_visibilities", ["shareable_id", "shareable_type", "user_id"], name: "shareable_and_user_id", using: :btree add_index "share_visibilities", ["shareable_id"], name: "index_post_visibilities_on_post_id", using: :btree + add_index "share_visibilities", ["user_id"], name: "index_share_visibilities_on_user_id", using: :btree create_table "simple_captcha_data", force: :cascade do |t| t.string "key", limit: 40 @@ -679,5 +677,5 @@ ActiveRecord::Schema.define(version: 20151210213023) do add_foreign_key "ppid", "users" add_foreign_key "profiles", "people", name: "profiles_person_id_fk", on_delete: :cascade add_foreign_key "services", "users", name: "services_user_id_fk", on_delete: :cascade - add_foreign_key "share_visibilities", "contacts", name: "post_visibilities_contact_id_fk", on_delete: :cascade + add_foreign_key "share_visibilities", "users", name: "share_visibilities_user_id_fk", on_delete: :cascade end