Open
Description
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)