singular_association.rb 1.3 KB
Newer Older
1 2
# frozen_string_literal: true

R
Rafael Mendonça França 已提交
3
# This class is inherited by the has_one and belongs_to association classes
4

5
module ActiveRecord::Associations::Builder # :nodoc:
6
  class SingularAssociation < Association #:nodoc:
7
    def self.valid_options(options)
8
      super + [:foreign_type, :required, :touch]
9
    end
10

11
    def self.define_accessors(model, reflection)
12
      super
13 14 15 16 17 18 19 20 21 22
      mixin = model.generated_association_methods
      name = reflection.name

      define_constructors(mixin, name) if reflection.constructable?

      mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
        def reload_#{name}
          association(:#{name}).force_reload_reader
        end
      CODE
23 24
    end

25
    # Defines the (build|create)_association methods for belongs_to or has_one association
26
    def self.define_constructors(mixin, name)
27 28 29 30
      mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
        def build_#{name}(*args, &block)
          association(:#{name}).build(*args, &block)
        end
31

32 33 34
        def create_#{name}(*args, &block)
          association(:#{name}).create(*args, &block)
        end
35

36 37 38 39
        def create_#{name}!(*args, &block)
          association(:#{name}).create!(*args, &block)
        end
      CODE
J
Jon Leighton 已提交
40
    end
41 42

    private_class_method :valid_options, :define_accessors, :define_constructors
43 44
  end
end