Skip to content

Instantly share code, notes, and snippets.


Chris Hapgood cch1

  • Sun Tribe Trading
  • Center of the Universe
View GitHub Profile
View gist:88231
class Tag
has_many :taggings
class Tagging
belongs_to :tag
belongs_to :posts
# uses a string 'flag' column but could be changed to a boolean important
# column later, hence the need to encapsulate!
View gist:88236
diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb
index 7f78191..e55b639 100755
--- a/activerecord/lib/active_record/associations.rb
+++ b/activerecord/lib/active_record/associations.rb
@@ -1557,7 +1557,8 @@ module ActiveRecord
:finder_sql, :counter_sql,
:before_add, :after_add, :before_remove, :after_remove,
:extend, :readonly,
- :validate
+ :validate,
cch1 / scoped_associations.rb
Created March 31, 2009 22:24
Monkey patch for scoped associations
View scoped_associations.rb
module ActiveRecord
class Reflection::AssociationReflection
# Return a named scope instead of the bare ActiveRecord::Base subclass.
def klass_with_scope
k = klass_without_scope
options[:scope].nil? ? k : k.send(options[:scope])
alias_method_chain :klass, :scope
View coerce_empty_strings.rb
# Recursively coerce empty string values in hash -particularly
# useful for HTTP POSTed forms.
# Values are coerced based on the rules mapping of params_hash keys to coerced values.
# See for background
def self.coerce_empty_strings(params_hash, rules = {})
return unless params_hash
params_hash.each_pair do |k,v|
# AR::Base.extract_callstack_for_multiparameter_attributes can't handle nil values
unless k.include?('(')
params_hash[k] = rules[k.to_sym] if v.kind_of?(String) && v.empty?
View microseconds_benchmark.rb
require 'benchmark'
ISO_DATETIME = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(\.\d+)?\z/
FAST_ISO_DATETIME = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(?:\.(\d+))?\z/
COUNT = 1000000
SRAND = 1455677931
DATETIME_STRING = "2010-01-12 12:34:56.%6.6i" do |bench|
f ="Fast") do
View Let-respond-to-do-the-heavy-action-cache-lifting.patch
From 36f25bf11b9e61b6361c829534dea2de0cf08acd Mon Sep 17 00:00:00 2001
From: Chris Hapgood <>
Date: Mon, 11 Oct 2010 09:42:05 -0400
Subject: [PATCH] Let respond_to do the heavy action cache lifting
In determining the best content type for a response, let respond_to consider
available content types using existing logic. Work hard to ensure that
cached content has an extension to indicate its content type.
.../lib/action_controller/caching/actions.rb | 73 ++++++++++----------
cch1 / deploy.rb
Created October 19, 2010 19:05
Post-Migration version
View deploy.rb
# Please install the Engine Yard Capistrano gem
# gem install eycap --source
require "eycap/recipes"
require 'new_relic/recipes'
# The following code has been lifted from config.rb
AppConfig = begin
require 'ostruct'
require 'yaml'
cch1 /
Created May 6, 2011 20:45
Setting up Emacs daemon on OS X

Setting up Emacs daemon on OS X

Tired of waiting for emacs to start on OS X? This step by step guide will teach you how to install the latest version of emacs and configure it to start in the background (daemon mode) and use emacsclient as your main editor.

Install Homebrew

First you'll need to install the [Homebrew package manager][brew] if yo haven't already. It is amazing.

View gist:1051772
;;(require 'copterj.git-version) ;; Pick up DRY'd version numbers
(require ' ;; Needed to locate newrelic
(let [java-agent (str "-javaagent:" ( "/lib/newrelic.jar")]
(defproject apij ~(copterj.git-version/git-describe)
:description "Hotelicopter's API"
[[com.hotelicopter/copterj "1.0.0-SNAPSHOT"]
cch1 / mocking-ex.clj
Created February 6, 2012 21:43 — forked from mwmitchell/mocking-ex.clj
with metaconstants
View mocking-ex.clj
(facts "/locations/:id/rates should limit the rate response count by the :limit param"
(let [params [:check_in (gen-check-in)
:check_out (gen-check-out)
:guests 1
:rooms 1
:limit ...limit...]]
(apply location-rate-request (:tid location-one) params) => truthy
(contains {:params (contains {:limit apij.views.rates.common/max-hotels})}))