elight / acts_as_commentable_with_threading

Similar to acts_as_commentable; however, utilizes awesome_nested_set to provide threaded comments
MIT License
672 stars 167 forks source link

Adding Comments as commentable #109

Open abhinaykumar opened 7 years ago

abhinaykumar commented 7 years ago

I tried adding Comments model as a commentable type in order to implement a reply feature. As it looked pretty straight forward to do something like this but I am not able to set the parent of the newly created comment. can you please tell me what could be a better way to implement replies.

Adding code example below:

> a = Comment.build_from(Comment.first, User.second.id, "Testing replies") > a.save! > a.move_to_child_of(Comment.first)

last line of code results in error:

Comment Load (0.4ms)  SELECT  "comments".* FROM "comments" ORDER BY "comments"."id" ASC LIMIT $1  [["LIMIT", 1]]
   (0.1ms)  BEGIN
  Comment Load (0.3ms)  SELECT  "comments".* FROM "comments" WHERE "comments"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  Comment Load (0.4ms)  SELECT  "comments".* FROM "comments" WHERE "comments"."id" = $1 LIMIT $2 FOR UPDATE  [["id", 34], ["LIMIT", 1]]
   (0.2ms)  ROLLBACK
CollectiveIdea::Acts::NestedSet::Move::ImpossibleMove: Impossible move, target node cannot be inside moved tree.
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/move.rb:118:in `prevent_impossible_move'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/move.rb:14:in `move'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/model/movable.rb:107:in `block (2 levels) in move_to'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `block in transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/transactions.rb:211:in `transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/transactions.rb:310:in `transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/model/transactable.rb:16:in `in_tenacious_transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/model/movable.rb:103:in `block in move_to'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/callbacks.rb:97:in `__run_callbacks__'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/callbacks.rb:750:in `_run_move_callbacks'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/callbacks.rb:90:in `run_callbacks'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/model/movable.rb:102:in `move_to'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/model/movable.rb:39:in `move_to_child_of'
        from (irb):13
... 1 levels...
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/console_helper.rb:9:in `start'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:78:in `console'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands.rb:18:in `<top (required)>'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `block in require'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require'
        from /Users/xxx/rails_projects/woovly/bin/rails:9:in `<top (required)>'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `block in load'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from -e:1:in `<main>'
Brotakuu commented 7 years ago

For debug purposes, verify that both comments are saved first.

> a = Comment.build_from(Comment.first, User.second.id, "Testing replies")
> a.save!
> a = Comment.last
> b = Comment.first
> a.move_to_child_of(b)
abhinaykumar commented 7 years ago

Same result

irb(main):003:0> a = Comment.last
  Comment Load (0.5ms)  SELECT  "comments".* FROM "comments" ORDER BY "comments"."id" DESC LIMIT $1  [["LIMIT", 1]]
=> #<Comment id: 91, commentable_id: 1, commentable_type: "Comment", title: nil, body: "Testing replies", subject: nil, user_id: 6, parent_id: nil, lft: 1, rgt: 2, created_at: "2017-04-09 08:19:05", updated_at: "2017-04-09 08:19:05", comments_count: 0>
irb(main):004:0> b = Comment.first
  Comment Load (0.7ms)  SELECT  "comments".* FROM "comments" ORDER BY "comments"."id" ASC LIMIT $1  [["LIMIT", 1]]
=> #<Comment id: 1, commentable_id: 43, commentable_type: "MyBucketList", title: nil, body: "nice", subject: nil, user_id: 6, parent_id: nil, lft: 1, rgt: 8, created_at: "2017-04-05 07:37:38", updated_at: "2017-04-07 05:40:42", comments_count: 1>
irb(main):005:0> a.move_to_child_of(b)
   (0.2ms)  BEGIN
  Comment Load (0.3ms)  SELECT  "comments".* FROM "comments" WHERE "comments"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  Comment Load (0.5ms)  SELECT  "comments".* FROM "comments" WHERE "comments"."id" = $1 LIMIT $2 FOR UPDATE  [["id", 91], ["LIMIT", 1]]
   (0.3ms)  ROLLBACK
CollectiveIdea::Acts::NestedSet::Move::ImpossibleMove: Impossible move, target node cannot be inside moved tree.
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/move.rb:118:in `prevent_impossible_move'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/move.rb:14:in `move'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/model/movable.rb:107:in `block (2 levels) in move_to'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `block in transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/transactions.rb:211:in `transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/transactions.rb:310:in `transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/model/transactable.rb:16:in `in_tenacious_transaction'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/model/movable.rb:103:in `block in move_to'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/callbacks.rb:97:in `__run_callbacks__'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/callbacks.rb:750:in `_run_move_callbacks'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/callbacks.rb:90:in `run_callbacks'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/model/movable.rb:102:in `move_to'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awesome_nested_set-3.1.1/lib/awesome_nested_set/model/movable.rb:39:in `move_to_child_of'
        from (irb):5
... 1 levels...
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/console_helper.rb:9:in `start'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:78:in `console'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/commands.rb:18:in `<top (required)>'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `block in require'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:293:in `require'
        from /Users/xxx/rails_projects/woovly/bin/rails:9:in `<top (required)>'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `block in load'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0.1/lib/active_support/dependencies.rb:287:in `load'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /Users/xxx/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from -e:1:in `<main>