Sha256: 7ce5fb300b9d0159ded1b3091635cfe8034fe21b714ab81b8f97aad7ee4d2676

Contents?: true

Size: 1.9 KB

Versions: 40

Compression:

Stored size: 1.9 KB

Contents

require 'spyke/associations/association'
require 'spyke/associations/builder'
require 'spyke/associations/has_many'
require 'spyke/associations/has_one'
require 'spyke/associations/belongs_to'

module Spyke
  module Associations
    extend ActiveSupport::Concern

    included do
      class_attribute :associations
      self.associations = {}.freeze
    end

    module ClassMethods
      def has_many(name, options = {})
        create_association(name, HasMany, options)

        define_method "#{name.to_s.singularize}_ids=" do |ids|
          attributes[name] = []
          ids.reject(&:blank?).each { |id| association(name).build(id: id) }
        end

        define_method "#{name.to_s.singularize}_ids" do
          association(name).map(&:id)
        end
      end

      def has_one(name, options = {})
        create_association(name, HasOne, options)

        define_method "build_#{name}" do |attributes = nil|
          association(name).build(attributes)
        end
      end

      def belongs_to(name, options = {})
        create_association(name, BelongsTo, options)

        define_method "build_#{name}" do |attributes = nil|
          association(name).build(attributes)
        end
      end

      def accepts_nested_attributes_for(*names)
        names.each do |association_name|
          class_eval <<-RUBY, __FILE__, __LINE__ + 1
            def #{association_name}_attributes=(association_attributes)
              association(:#{association_name}).assign_nested_attributes(association_attributes)
            end
          RUBY
        end
      end

      def reflect_on_association(name)
        # Just enough to support nested_form gem
        associations[name] || associations[name.to_s.pluralize.to_sym]
      end

      private

        def create_association(name, type, options)
          self.associations = associations.merge(name => Builder.new(self, name, type, options))
        end
    end
  end
end

Version data entries

40 entries across 40 versions & 1 rubygems

Version Path
spyke-7.2.2 lib/spyke/associations.rb
spyke-7.1.1 lib/spyke/associations.rb
spyke-7.1.0 lib/spyke/associations.rb
spyke-7.0.0 lib/spyke/associations.rb
spyke-6.1.3 lib/spyke/associations.rb
spyke-6.1.2 lib/spyke/associations.rb
spyke-6.1.1 lib/spyke/associations.rb
spyke-6.1.0 lib/spyke/associations.rb
spyke-6.0.0 lib/spyke/associations.rb
spyke-5.4.3 lib/spyke/associations.rb
spyke-5.4.2 lib/spyke/associations.rb
spyke-5.4.1 lib/spyke/associations.rb
spyke-5.4.0 lib/spyke/associations.rb
spyke-5.3.4 lib/spyke/associations.rb
spyke-5.3.3 lib/spyke/associations.rb
spyke-5.3.2 lib/spyke/associations.rb
spyke-5.3.1 lib/spyke/associations.rb
spyke-5.3.0 lib/spyke/associations.rb
spyke-5.2.0 lib/spyke/associations.rb
spyke-5.1.0 lib/spyke/associations.rb