discourse/db/migrate/20160225050317_add_user_options.rb
Sam 3829c78526 PERF: shift most user options out of the user table
As it stands we load up user records quite frequently on the topic pages,
this in turn pulls all the columns for the users being selected, just to
discard them after they are loaded

New structure keeps all options in a discrete table, this is better organised
and allows us to easily add more column without worrying about bloating the
user table
2016-02-17 18:08:25 +11:00

77 lines
2.6 KiB
Ruby

class AddUserOptions < ActiveRecord::Migration
def up
create_table :user_options, id: false do |t|
t.integer :user_id, null: false
t.boolean :email_always, null: false, default: false
t.boolean :mailing_list_mode, null: false, default: false
t.boolean :email_digests
t.boolean :email_direct, null: false, default: true
t.boolean :email_private_messages, null: false, default: true
t.boolean :external_links_in_new_tab, null: false, default: false
t.boolean :enable_quoting, null: false, default: true
t.boolean :dynamic_favicon, null: false, default: false
t.boolean :disable_jump_reply, null: false, default: false
t.boolean :edit_history_public, null: false, default: false
t.boolean :automatically_unpin_topics, null: false, default: true
t.integer :digest_after_days
end
add_index :user_options, [:user_id], unique: true
execute <<SQL
INSERT INTO user_options (
user_id,
email_always,
mailing_list_mode,
email_digests,
email_direct,
email_private_messages,
external_links_in_new_tab,
enable_quoting,
dynamic_favicon,
disable_jump_reply,
edit_history_public,
automatically_unpin_topics,
digest_after_days
)
SELECT id,
email_always,
mailing_list_mode,
email_digests,
email_direct,
email_private_messages,
external_links_in_new_tab,
enable_quoting,
dynamic_favicon,
disable_jump_reply,
edit_history_public,
automatically_unpin_topics,
digest_after_days
FROM users
SQL
# these can not be removed until a bit later
# if we remove them now all currently running unicorns will start erroring out
#
# remove_column :users, :email_always
# remove_column :users, :mailing_list_mode
# remove_column :users, :email_digests
# remove_column :users, :email_direct
# remove_column :users, :email_private_messages
# remove_column :users, :external_links_in_new_tab
# remove_column :users, :enable_quoting
# remove_column :users, :dynamic_favicon
# remove_column :users, :disable_jump_reply
# remove_column :users, :edit_history_public
# remove_column :users, :automatically_unpin_topics
# remove_column :users, :digest_after_days
end
def down
# we can not move backwards here cause columns
# get removed an hour after the migration
raise ActiveRecord::IrreversibleMigration
end
end