Skip to content

Instantly share code, notes, and snippets.

View inopinatus's full-sized avatar
🐼
fuzzy logic

Josh Goodall inopinatus

🐼
fuzzy logic
View GitHub Profile
@inopinatus
inopinatus / application_record.rb
Created October 14, 2020 00:53
values_at for active record models
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
unless instance_methods.include?(:values_at)
def values_at(*methods)
methods.flatten.map! { |method| public_send(method) }
end
end
end
@inopinatus
inopinatus / config_objects.rb
Last active October 5, 2020 07:45
excessively dynamic accessors
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 / latest_association_by_distinct_on.rb
Last active September 19, 2020 05:09
preloading the latest of an associated collection
class Post
has_many :comments
has_one :latest_comment, -> { latest_by :post_id }, class_name: 'Comment'
class Comment
scope :latest_by, -> column {
from(
order(column, created_at: :desc).arel
.distinct_on(arel_table[column])
.as(quoted_table_name))
@inopinatus
inopinatus / matches_any.rb
Created September 16, 2020 18:02
programmatic LIKE in Arel
scope :search_uid, ->(*terms) {
where(arel_attribute(:uid).matches_any(terms.map {|term| "%#{sanitize_sql_like term}%" }, nil, true))
}
@inopinatus
inopinatus / callback_registration_tracing.rb
Created September 14, 2020 22:42
initializer for determining where callbacks were registered
# frozen_string_literal: true
module CallbackRegistrationTracing
module Capture
def normalize_callback_params(*args)
super.tap do |_, _, options|
options[:_caller] = caller(3)
end
end
end
@inopinatus
inopinatus / arel_reverse_order_issues.rb
Last active September 4, 2020 07:44
Arel and reverse_order interaction
# 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
@inopinatus
inopinatus / work_allocation.rb
Created August 29, 2020 03:43
Work allocation
# 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 August 24, 2020 15:07
AR generalised association join, group, count, and filter
# 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
@inopinatus
inopinatus / adderall.rb
Last active August 20, 2020 12:56
Adderall
# 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?)
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)
}