method

new

Importance_0
v7.0.0 - Show latest stable - 0 notes - Class: PrimaryKeyError
new(label, association, value) public

No documentation

This method has no description. You can help the Ruby on Rails community by adding new notes.

Hide source
# File activerecord/lib/active_record/fixture_set/table_row.rb, line 43
        def initialize(label, association, value)
          super(<<~MSG)
            Unable to set #{association.name} to #{value} because the association has a
            custom primary key (#{association.join_primary_key}) that does not match the
            associated table's primary key (#{association.klass.primary_key}).

            To fix this, change your fixture from

            #{label}:
              #{association.name}: #{value}

            to

            #{label}:
              #{association.foreign_key}: **value**

            where **value** is the #{association.join_primary_key} value for the
            associated #{association.klass.name} record.
          MSG
        end
      end

      def initialize(fixture, table_rows:, label:, now:)
        @table_rows = table_rows
        @label = label
        @now = now
        @row = fixture.to_hash
        fill_row_model_attributes
      end

      def to_hash
        @row
      end

      private
        def model_metadata
          @table_rows.model_metadata
        end

        def model_class
          @table_rows.model_class
        end

        def fill_row_model_attributes
          return unless model_class
          fill_timestamps
          interpolate_label
          generate_primary_key
          resolve_enums
          resolve_sti_reflections
        end

        def reflection_class
          @reflection_class ||= if @row.include?(model_metadata.inheritance_column_name)
            @row[model_metadata.inheritance_column_name].constantize rescue model_class
          else
            model_class
          end
        end

        def fill_timestamps
          # fill in timestamp columns if they aren't specified and the model is set to record_timestamps
          if model_class.record_timestamps
            model_metadata.timestamp_column_names.each do |c_name|
              @row[c_name] = @now unless @row.key?(c_name)
            end
          end
        end
Register or log in to add new notes.