module OccamsRecord::Ugly

This module contains helpers for things you shouldn't, but sometimes must, do in legacy codebases.

Public Class Methods

active_record(model, record) click to toggle source

Loads an Occams Record object into an ActiveRecord model. THIS WILL NEGATE ALL PERFORMANCE IMPROVEMENTS! The ONLY reason to use this is if you absolutely need ActiveRecord objects but still want to use Occams's more advanced eager loading or find_each/find_in_batches features.

OccamsRecord.
  query(Order.order("created_at DESC")).
  eager_load(:line_items, ->(q) { q.order("price") }).
  find_each do |o|
    order = OccamsRecord::Ugly.active_record(o)
    ...
  end

@param model [ActiveRecord::Base] The model to load the record into @param record [OccamsRecord::Result::Row] The OccamsRecord row @return [ActiveRecord::Base]

# File lib/occams-record/ugly.rb, line 23
def self.active_record(model, record)
  active = model.new(record.to_h)

  record.class.associations.each do |assoc_name|
    assoc = active.class.reflections[assoc_name]
    obj = record.send assoc_name
    next if assoc.nil? or obj.nil?

    if obj.is_a? Array
      active.send(assoc_name).load_target.replace obj.map { |x|
        active_record(assoc.klass, x)
      }
    else
      active.send "#{assoc_name}=", active_record(assoc.klass, obj)
    end
  end

  active
end