Skip to content

after_add callback not called when updating using the foreign_key #81

Open
@rluvaton

Description

@rluvaton

Hey, for some reason, when I update the foreign_key of the collection it does not run the after_add callback

# frozen_string_literal: true
require 'torque-postgresql'

require 'byebug'
require "active_record"
require "minitest/autorun"
require "logger"

ActiveRecord::Base.establish_connection(
  adapter:  "postgresql",
  database: "test",
  encoding: "unicode",
  host:     "localhost",
  port:     "5432",
  password: "12345",
  username: "test")

ActiveRecord::Schema.define do
  drop_table "employees", if_exists: true
  drop_table "projects", if_exists: true

  create_table "employees" do |t|
    t.string "name"
    t.timestamps
  end

  create_table "projects" do |t|
    t.string "title"
    t.bigint "employees_ids", array: true
    t.timestamps
  end
end

class Employee < ActiveRecord::Base
  has_many :projects, array: true, foreign_key: :employees_ids

  after_commit :on_update, on: :update

  def on_update
    puts "Employee got updated"
  end
end

class Project < ActiveRecord::Base
  belongs_to_many :employees, foreign_key: "employees_ids" , after_add: :on_employee_added

  def on_employee_added(employee)
    puts "project: #{self.title} | employee added: #{employee.name}"
  end
end

# Not working
def run_using_ids
  employee_id = (Employee.create!(name: 'employee_by_id')).id
  project_id = (Project.create!(title: 'project_by_id')).id

  puts "[ids] Adding employee to project"
  project = Project.find_by(id: project_id)
  project.employees_ids = [employee_id]
  project.save!
end

# Working
def run_using_records
  employee = (Employee.create!(name: 'employee_by_record'))
  project_id = (Project.create!(title: 'project_by_record')).id

  puts "[records] Adding employee to project"
  project = Project.find_by(id: project_id)
  project.employees = [employee]
  project.save!
end



run_using_ids

run_using_records

the run_by_ids function does not call the on_employee_added after_add method while the run_using_records does

Currently, this will be logged would be:

[ids] Adding employee to project
[records] Adding employee to project
project: project_by_record | employee added: employee_by_record

(we missing project: project_by_id | employee added: employee_by_id line)

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions