Module: ROM::Plugins::Relation::SQL::AutoRestrictions

Defined in:
lib/rom/plugins/relation/sql/auto_restrictions.rb

Overview

Generates methods for restricting relations by their indexed attributes

This plugin must be enabled for the whole adapter, ‘use` won’t work as schema is not yet available, unless it was defined explicitly.

Examples:

rom = ROM.container(:sql, 'sqlite::memory') do |config|
  config.create_table(:users) do
    primary_key :id
    column :email, String, null: false, unique: true
  end

  config.plugin(:sql, relations: :auto_restrictions)

  config.relation(:users) do
    schema(infer: true)
  end
end

# now `by_email` is available automatically
rom.relations[:users].by_email('[email protected]')

Constant Summary collapse

EmptySchemaError =
Class.new(ArgumentError) do
  def initialize(klass)
    super("#{klass} relation has no schema. " \
          "Make sure :auto_restrictions is enabled after defining a schema")
  end
end

Class Method Summary collapse

Class Method Details

.included(klass) ⇒ Object

Raises:



36
37
38
39
40
41
42
43
# File 'lib/rom/plugins/relation/sql/auto_restrictions.rb', line 36

def self.included(klass)
  super
  schema = klass.schema
  raise EmptySchemaError, klass if schema.nil?
  methods, mod = restriction_methods(schema)
  klass.include(mod)
  methods.each { |meth| klass.auto_curry(meth) }
end

.restriction_methods(schema) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/rom/plugins/relation/sql/auto_restrictions.rb', line 45

def self.restriction_methods(schema)
  mod = Module.new

  indexed_attrs = schema.select { |attr| attr.meta[:index] }

  methods = indexed_attrs.map do |attr|
    meth_name = :"by_#{attr.name}"

    mod.module_eval do
      define_method(meth_name) do |value|
        where(attr.is(value))
      end
    end

    meth_name
  end

  [methods, mod]
end