Skip to content

Instantly share code, notes, and snippets.

Avatar
🐼
fuzzy logic

Josh Goodall inopinatus

🐼
fuzzy logic
View GitHub Profile
@inopinatus
inopinatus / config_objects.rb
Last active Oct 5, 2020
excessively dynamic accessors
View config_objects.rb
class MyConfiguration < BasicObject
def method_missing name, *args
getter = name.end_with?(?=) ? name[0..-2] : name
(class << self; self end).class_eval { attr_accessor getter }
__send__ name, *args
end
end
config = MyConfiguration.new
config.liverpool = 4
@inopinatus
inopinatus / arel_reverse_order_issues.rb
Last active Sep 4, 2020
Arel and reverse_order interaction
View arel_reverse_order_issues.rb
# frozen_string_literal: true
# In this example we have an application concerned about the length of a string,
# and is pushing the work to the database for efficiency. There is an index
# on the length of a Post's title, and the scopes and orderings have been
# neatly refactored to minimise the amount of Arel required.
#
# A bug has now arisen in the behaviour of `last`. It is giving the first.
#
# Subsequent investigation has shown that customers were also complaining that
View work_allocation.rb
# frozen_string_literal: true
class WorkAllocation
# Runtime process allocations. Last reviewed: 24/9/2019
# Half a gig system allocation for agents and monitors and, unfortunately,
# a couple of deploy-time asset compiles due to dependencies. It's
# okay to push some processes into swap on smaller instances during
# deploy. Ideally we wouldn't compile on-instance at all.
OPS_MEMORY_ALLOWANCE = 512
@inopinatus
inopinatus / exceeding.rb
Created Aug 24, 2020
AR generalised association join, group, count, and filter
View exceeding.rb
# app/models/concerns/exceeding.rb
module Exceeding
extend ActiveSupport::Concern
included do
scope :exceeds, ->(association, n) do
joins(association).group(primary_key).having(arel_table[primary_key].count.gteq n)
end
end
end
View adderall.rb
# app/lib/adderall.rb
module Adderall
def adderall(column_name, relation = self, filter = :itself)
owner = proxy_association.owner
records = proxy_association.target
if loaded? || owner.new_record?
relation = none
else
records = records.select(&:new_record?)
@inopinatus
inopinatus / inequalities.md
Last active May 10, 2020
ar inequalities
View inequalities.md
Inequality Interval Ruby range Active Record* Arel**
n >= x [x..∞) x.. where(n: x..) n.gteq(x)
n <= x (-∞..x] ..x where(n: ..x) n.lteq(x)
n < x (-∞..x) ...x where(n: ...x) n.lt(x)
n > x (x..∞) n/a where.not(n: ..x) n.gt(x)
x <= n <= y [x..y] x..y where(n: x..y) n.between(x..y)
x <= n < y [x..y) x...y where(n: x...y) n.between(x...y)
x < n <= y (x..y] n/a where.not(n: ..x).where(n: ..y) n.gt(x).and(n.lteq(y))
x < n < y (x..y) n/a where.not(n: ..x).where(n: ...y) n.gt(x).and(n.lt(y))
View by_most.rb
module ByMost
extend ActiveSupport::Concern
included do
scope :by_most, ->(assoc) {
reflection = reflect_on_association(assoc)
left_joins(assoc)
.group(primary_key)
.order(reflection.klass.arel_table[reflection.foreign_key].count.desc)
}
View digest_queries.rb
module DigestQueries
def predicate_builder
@predicate_builder ||= super.tap do |pb|
pb.register_handler(Digest::Instance, DigestHandler.new(pb))
end
end
class DigestHandler
def initialize(predicate_builder)
@predicate_builder = predicate_builder
@inopinatus
inopinatus / frequency_extension.rb
Last active May 10, 2020
arel "most frequent"
View frequency_extension.rb
module FrequencyExtension
def most_frequent
frequency_order.take
end
def frequency_order
group(arel_attribute(primary_key).order(arel_attribute(primary_key).count.desc)
end
end
View yfib.rb
y = ->(f) {
->(x) { x.(x) }.(
->(x) { f.(->(v) { x.(x).(v) }) } )
}
fib = y.(->(f) {
->(n) { n < 2 ? Array(0..n) : f[n-1].then { _1 << _1[-1] + _1[-2] } }
})
fib[6] #=> [0, 1, 1, 2, 3, 5, 8]