Skip to content

Instantly share code, notes, and snippets.

@ccyrille
ccyrille / zero_downtime_add_column_with_constraint.rb
Last active February 7, 2018 16:36
Zero Downtime - Add column with constraint
class User < ActiveRecord::Base
...
validates_presence_of :new_column,
# << REMOVE ON NEXT RELASE
if: Proc.new { |o| o.has_attribute?(:new_column) }
# >> REMOVE ON NEXT RELEASE
...
end
@ccyrille
ccyrille / zero_downtime_remove_column.rb
Created February 7, 2018 16:34
Zero Downtime - Remove a column
class User < ActiveRecord::Base
...
# << REMOVE ON NEXT RELASE
def self.columns
super.reject { |c| c.name == "removed_column" }
end
# >> REMOVE ON NEXT RELEASE
...
end
@ccyrille
ccyrille / zero_downtime_rename_column_migration_1.rb
Last active February 7, 2018 16:40
Zero Downtime - Rename column migration (1/3)
class AddNewColumnToUsers < ActiveRecord::Migration
def change
add_column :users, :new_column, :text
end
end
@ccyrille
ccyrille / zero_downtime_rename_column_migration_2.rb
Last active January 27, 2020 03:55
Zero Downtime - Rename column migration (2/3)
class MigrateFromOldColumnToNewColumn < ActiveRecord::Migration
disable_ddl_transaction!
def up
User.find_in_batches do |mates|
User.where(id: mates.map(&:id))
.update_all("new_column=old_column")
end
end
def down
@ccyrille
ccyrille / zero_downtime_rename_column_migration_3.rb
Last active February 7, 2018 16:40
Zero Downtime - Rename column migration (3/3)
class RemoveUsersOldColumn < ActiveRecord::Migration
def change
remove_column :users, :old_column
end
end
@ccyrille
ccyrille / zero_downtime_rename_column.rb
Last active April 26, 2024 10:39
Zero Downtime - Rename Column
class User < ActiveRecord::Base
...
# << REMOVE ON NEXT RELASE
def new_column
if self.class.column_names.include?("old_column")
self.class.reset_column_information
end
has_attribute?(:old_column) ? old_column : super
end
@ccyrille
ccyrille / zero_downtime_add_table.rb
Created February 7, 2018 16:17
Zero Downtime - Add a table
# << REMOVE ON NEXT RELASE
unless NewModel.table_exists?
# Fancy fallback goes here
return
end
# >> REMOVE ON NEXT RELEASE
# Real implementation goes here
@ccyrille
ccyrille / octokit-github-api-connection.rb
Last active October 19, 2016 17:06
Connect to github API using octokit & .netrc
#!/usr/bin/env ruby
require 'io/console'
require 'octokit'
require 'netrc'
GITHUB_API_URL = "api.github.com"
def clear_github_netrc
n = Netrc.read
n.delete(GITHUB_API_URL)
@ccyrille
ccyrille / celluloid-parallel-networking-benchmark.rb
Last active July 28, 2016 14:29
Benchmark Celluloid with Faraday
require 'celluloid/current'
require 'celluloid/io'
require 'faraday'
require 'benchmark'
URL = 'https://api.wayzup.com'
PATH = '/v1/infos'
ADAPTER = Faraday.default_adapter
ITERATIONS = 20
@ccyrille
ccyrille / google-webmaster-crawl-errors-listing.rb
Last active December 16, 2015 11:19
Get all Google Webmaster Tools crawl errors for a given website
require 'net/https'
require 'nokogiri'
require 'date'
require 'csv'
# PARAMETERS
GOOGLE_ACCOUNT_EMAIL = '<YOUR_GOOGLE_EMAIL>'
GOOGLE_ACCOUNT_PASSWORD = '<YOUR_GOOGLE_PASSWORD>'
SITE_URL = '<WEBSITE_URL>'
CSV_OUTPUT_FILE = "GoogleWebmaster-#{SITE_URL}-crawlErrors.csv"