Gem version: 2.6.1
Rails version: 5.0.1
$ rails new treeapp
# add acts_as_tree to Gemfile and bundle
$ ./bin/rails g scaffold Node label parent_id:integer children_count:integer
$ ./bin/rails db:migrate
The Node class:
class Node < ApplicationRecord
acts_as_tree counter_cache: true
end
Create the following structure using the browser ( a -> 1 ; a.1 -> 2; a.2 -> 3; b -> 4 ):
root
|_ a
| |_ a.1
| |_ a.2
|_ b
Then through the browser move a.2 under b, browse to /nodes/3/edit update the parent_id to 4 (b node) and submit the form. This is what I get in the log:
Started PATCH "/nodes/3" for ::1 at 2017-02-24 12:55:13 +0100
Processing by NodesController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"x9Rk", "node"=>{"label"=>"a.2", "parent_id"=>"4", "children_count"=>""}, "commit"=>"Update Node", "id"=>"3"}
Node Load (0.1ms) SELECT "nodes".* FROM "nodes" WHERE "nodes"."id" = ? LIMIT ? [["id", 3], ["LIMIT", 1]]
(0.1ms) begin transaction
SQL (0.5ms) UPDATE "nodes" SET "parent_id" = ?, "updated_at" = ? WHERE "nodes"."id" = ? [["parent_id", 4], ["updated_at", 2017-02-24 11:55:13 UTC], ["id", 3]]
SQL (0.1ms) UPDATE "nodes" SET "children_count" = COALESCE("children_count", 0) + 1 WHERE "nodes"."id" = ? [["id", 4]]
SQL (0.2ms) UPDATE "nodes" SET "children_count" = COALESCE("children_count", 0) - 1 WHERE "nodes"."id" = ? [["id", 1]]
SQL (0.2ms) UPDATE "nodes" SET "children_count" = COALESCE("children_count", 0) - 1 WHERE "nodes"."id" = ? [["id", 1]]
SQL (0.2ms) UPDATE "nodes" SET "children_count" = COALESCE("children_count", 0) + 1 WHERE "nodes"."id" = ? [["id", 4]]
(2.5ms) commit transaction
Redirected to http://localhost:3000/nodes/3
Completed 302 Found in 17ms (ActiveRecord: 3.9ms)
It seems like the counter_cache callbacks are being called twice. After this operation :children_count for a is now 0 and children count for b is now 2 when they should be 1 for a and 1 for b.
What am I missing? Thanks!
Gem version: 2.6.1
Rails version: 5.0.1
The Node class:
Create the following structure using the browser ( a -> 1 ; a.1 -> 2; a.2 -> 3; b -> 4 ):
Then through the browser move
a.2underb, browse to/nodes/3/editupdate the parent_id to 4 (bnode) and submit the form. This is what I get in the log:It seems like the counter_cache callbacks are being called twice. After this operation
:children_countforais now 0 and children count forbis now 2 when they should be 1 foraand 1 forb.What am I missing? Thanks!