Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • T torque-postgresql
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 6
    • Issues 6
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 1
    • Merge requests 1
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Carlos
  • torque-postgresql
  • Issues
  • #81
Closed
Open
Issue created Mar 16, 2023 by Administrator@rootContributor

`after_add` callback not called when updating using the `foreign_key`

Created by: 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)

Assignee
Assign to
Time tracking