module SiteSettings; end class SiteSettings::DbProvider def initialize(model) model.after_commit do model.notify_changed! end @model = model end def all return [] unless table_exists? # note, not leaking out AR records, cause I want all editing to happen # via this API SqlBuilder.new("select name, data_type, value from #{@model.table_name}").map_exec(OpenStruct) end def find(name) return nil unless table_exists? # note, not leaking out AR records, cause I want all editing to happen # via this API SqlBuilder.new("select name, data_type, value from #{@model.table_name} where name = :name") .map_exec(OpenStruct, name: name) .first end def save(name, value, data_type) return unless table_exists? model = @model.find_by({ name: name }) model ||= @model.new model.name = name model.value = value model.data_type = data_type # save! used to ensure after_commit is called model.save! true end def destroy(name) return unless table_exists? @model.where(name: name).destroy_all end def current_site RailsMultisite::ConnectionManagement.current_db end protected # table is not in the db yet, initial migration, etc def table_exists? @table_exists = ActiveRecord::Base.connection.table_exists? @model.table_name unless @table_exists @table_exists end end