Skip to content

Instantly share code, notes, and snippets.

View sfcgeorge's full-sized avatar
🦔

Simon George sfcgeorge

🦔
View GitHub Profile
@sfcgeorge
sfcgeorge / opts_to_ivars.rb
Created March 17, 2016 10:59
Passing a lot of variables into a mailer that I want to access from the view, so decided to dynamically set the instance variables from opts
class DynamicIvars
def greet(**options)
options.each { |k, v| instance_variable_set :"@#{k}", v }
p @hello
end
end
DynamicIvars.new.greet hello: "world"
# => "world"
@sfcgeorge
sfcgeorge / json_slop.rb
Created April 11, 2017 10:17
Use JSON as a Ruby object like you just don't care, if you like OpenStruct you'll love JsonSlop!
require "json"
class JsonSlop
def initialize(json)
@hash = json.is_a?(String) ? JSON.parse(json) : json
end
def call
JsonSlopProxy.new(@hash)
end
@sfcgeorge
sfcgeorge / telephone_words.rb
Created September 7, 2017 20:44
Telephone Words
require "pp"
MAPPING = {
1 => [],
2 => %w(A B C),
3 => %w(D E F),
4 => %w(G H I),
5 => %w(J K L),
6 => %w(M N O),
7 => %w(P Q R S),
@sfcgeorge
sfcgeorge / concern.rb
Last active February 7, 2018 16:42
Tweaked ActiveSupport::Concern to work around Opal issue
module ActiveSupport
# A typical module looks like this:
#
# module M
# def self.included(base)
# base.extend ClassMethods
# base.class_eval do
# scope :disabled, -> { where(disabled: true) }
# end
# end

Example Blog App with Auth

Pure Rails compared to Hyperloop

The purpose here is to show a high level overview of how Rails concepts map to Hyperloop concepts. It's not a full tutorial (I started doing that but it was way too long), but examples of key points.

Auth

Here's a simple auth example, with a comment showing all you have to add to hook it up to Hyperloop. In a production app you'd probably use Devise, but the Hyperloop acting_user bit would be the same!

@sfcgeorge
sfcgeorge / count_estimate.sql
Created September 14, 2018 09:02
Faster PostgreSQL COUNT function for large result sets by using query planner estimates.
CREATE FUNCTION count_estimate(query text) RETURNS integer AS $$
DECLARE
rec record;
rows integer;
row integer;
BEGIN
rows := 1;
FOR rec IN EXECUTE 'EXPLAIN ' || query LOOP
row := substring(rec."QUERY PLAN" FROM ' rows=([[:digit:]]+)')::integer;
IF (row != 0) THEN rows := rows * row; END IF;
@sfcgeorge
sfcgeorge / comparison.md
Created May 15, 2019 19:14
Mobile Frameworks Comparison
Framework Multi platform Native code Native UI Native widgets Declarative UI Native UX
Native no yes yes yes no yes
Ruby Motion mobile yes yes yes no yes
Cordova mobile yes yes yes no yes
RNW yes no yes no yes with effort
NativeScript yes no yes no yes with effort
Flutter yes (web coming) yes yes no yes maybe
Cordova yes no no no yes no
@sfcgeorge
sfcgeorge / association_loader.rb
Created September 20, 2019 14:43
GraphQL Ruby Chain Loader
# frozen_string_literal: true
# https://github.com/Shopify/graphql-batch/blob/master/examples/association_loader.rb
require 'graphql/batch'
class AssociationLoader < GraphQL::Batch::Loader
def initialize(association_name)
@association_name = association_name
end
@sfcgeorge
sfcgeorge / keybase.md
Created October 9, 2019 10:29
keybase.md

Keybase proof

I hereby claim:

  • I am sfcgeorge on github.
  • I am sfcgeorge (https://keybase.io/sfcgeorge) on keybase.
  • I have a public key ASCbgmrBCz_87ERTRKj2j_VQgtSIRfLz4aUq7rXokPf-zwo

To claim this, I am signing this object:

@sfcgeorge
sfcgeorge / scenic_view_sort_patch.rb
Created December 16, 2019 11:05
Patch 1 method in Scenic's schema dumper so that views are sorted first alphabetically, and then have any dependencies resolved.
# frozen_string_literal: true
require 'rails'
require 'scenic'
module Scenic
# @api private
module SchemaDumper
private