Sha256: e0a4773ec91eee6cd8629afd55265a9c25f29e0b87a0e51972b6a61706665cd4

Contents?: true

Size: 970 Bytes

Versions: 1

Compression:

Stored size: 970 Bytes

Contents

# frozen_string_literal: true

require 'array_association/version'
require 'active_support/concern'

# Usage:
#
#   include ArrayAssociation
#   array_column :order_ids, :orders, { class: Order }
#
# in this case some methods will be defined:
#   orders, which returns collection of Order
#   order_ids=, which sets normalized order_ids
#   orders=(values), which maps collection and sets order_ids
#
module ArrayAssociation
  extend ActiveSupport::Concern

  autoload :Utils, 'array_association/utils'

  module ClassMethods
    def array_column(column, collection, options)
      define_method collection do
        options[:class].send(:where, id: send(column))
      end

      define_method "#{column}=" do |value|
        ids = Utils.normalize_integer_array(value)
        write_attribute(column, ids)
      end

      define_method "#{collection}=" do |values|
        ids = Array.wrap(values).map(&:id)
        send "#{column}=", ids
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
array_association-0.1.0 lib/array_association.rb