lml / commontator

A Rails engine for comments
MIT License
354 stars 99 forks source link

migration from zero fails unless `acts_as_commontator` is commented out #158

Closed lastobelus closed 4 years ago

lastobelus commented 4 years ago

it may only be affecting migrations with a reversible do |change| block.

example trace:

PG::UndefinedTable: ERROR:  relation "commontator_threads" does not exist
LINE 8:                WHERE a.attrelid = '"commontator_threads"'::r...
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
                     c.collname, col_description(a.attrelid, a.attnum) AS comment
                FROM pg_attribute a
                LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                LEFT JOIN pg_type t ON a.atttypid = t.oid
                LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation
               WHERE a.attrelid = '"commontator_threads"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/postgresql/database_statements.rb:63:in `async_exec'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/postgresql/database_statements.rb:63:in `block (2 levels) in query'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/dependencies/interlock.rb:48:in `block in permit_concurrent_loads'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/concurrency/share_lock.rb:187:in `yield_shares'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/dependencies/interlock.rb:47:in `permit_concurrent_loads'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/postgresql/database_statements.rb:62:in `block in query'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract_adapter.rb:581:in `block (2 levels) in log'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract_adapter.rb:580:in `block in log'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:23:in `instrument'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract_adapter.rb:571:in `log'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/postgresql/database_statements.rb:61:in `query'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:757:in `column_definitions'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/schema_statements.rb:113:in `columns'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/schema_cache.rb:69:in `columns'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/schema_cache.rb:75:in `columns_hash'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/model_schema.rb:466:in `load_schema!'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/attributes.rb:234:in `load_schema!'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/attribute_decorators.rb:51:in `load_schema!'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/model_schema.rb:459:in `block in load_schema'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/model_schema.rb:456:in `load_schema'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/model_schema.rb:346:in `attribute_types'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/attribute_methods.rb:230:in `has_attribute?'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/inheritance.rb:55:in `new'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/reflection.rb:154:in `build_association'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/association.rb:284:in `build_record'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/singular_association.rb:21:in `build'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/builder/singular_association.rb:29:in `build_thread'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/commontator-5.1.0/lib/commontator/acts_as_commontable.rb:34:in `thread'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activemodel-5.2.3/lib/active_model/validator.rb:150:in `block in validate'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activemodel-5.2.3/lib/active_model/validator.rb:149:in `each'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activemodel-5.2.3/lib/active_model/validator.rb:149:in `validate'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:426:in `block in make_lambda'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:198:in `block (2 levels) in halting'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:606:in `block (2 levels) in default_terminator'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:605:in `catch'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:605:in `block in default_terminator'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:199:in `block in halting'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:513:in `block in invoke_before'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:513:in `each'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:513:in `invoke_before'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:131:in `run_callbacks'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:816:in `_run_validate_callbacks'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activemodel-5.2.3/lib/active_model/validations.rb:409:in `run_validations!'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activemodel-5.2.3/lib/active_model/validations/callbacks.rb:118:in `block in run_validations!'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:132:in `run_callbacks'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activesupport-5.2.3/lib/active_support/callbacks.rb:816:in `_run_validation_callbacks'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activemodel-5.2.3/lib/active_model/validations/callbacks.rb:118:in `run_validations!'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activemodel-5.2.3/lib/active_model/validations.rb:339:in `valid?'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/validations.rb:67:in `valid?'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/validations.rb:84:in `perform_validations'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/validations.rb:46:in `save'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/transactions.rb:310:in `block (2 levels) in save'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/transactions.rb:387:in `block in with_transaction_returning_status'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:265:in `transaction'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/transactions.rb:212:in `transaction'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/transactions.rb:385:in `with_transaction_returning_status'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/transactions.rb:310:in `block in save'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/transactions.rb:325:in `rollback_active_record_state!'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/transactions.rb:309:in `save'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/suppressor.rb:44:in `save'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/collection_association.rb:377:in `insert_record'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/has_many_association.rb:36:in `insert_record'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/collection_association.rb:362:in `block (2 levels) in _create_record'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/collection_association.rb:458:in `replace_on_target'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/collection_association.rb:283:in `add_to_target'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/collection_association.rb:361:in `block in _create_record'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/collection_association.rb:135:in `block in transaction'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:265:in `transaction'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/transactions.rb:212:in `transaction'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/collection_association.rb:134:in `transaction'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/collection_association.rb:359:in `_create_record'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/has_many_association.rb:124:in `_create_record'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/association.rb:190:in `create'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/associations/collection_proxy.rb:350:in `create'
/Users/lasto/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.3/lib/active_record/relation.rb:164:in `find_or_create_by'
/Users/lasto/clients/simplipleasure/sp-fulfillment/db/migrate/20180723175026_setup_slc_shipping_services.rb:33:in `block (3 levels) in change'
Dantemss commented 4 years ago

I think what is happening here is your 20180723175026_setup_slc_shipping_services.rb migration line 33 is trying to use a record that acts_as_commontator but the commontator tables do not exist yet.

I think I can probably add a guard to acts_as_commontator so it doesn't blow up if the tables don't exist yet...

lastobelus commented 4 years ago

👍

lastobelus commented 4 years ago

...also acts_as_commontable

Dantemss commented 4 years ago

OK I reproduced the issue in my dummy app and... not sure how it should be fixed. If the Commontator tables don't exist yet but you are creating a record that should have a comment thread, then Commontator cannot automatically create the thread record. I could make it skip creating the thread in that case, but then it would be a surprise when some (but not all) records are missing the comment thread... A fix for your app would be to reorder the migrations so Commontator's migrations happen before the failing migration when running from scratch.

Dantemss commented 4 years ago

Hmm on second thought... the thread is supposed to build automatically anyway. So maybe having it delay thread creation is not so bad.

Dantemss commented 4 years ago

Fixed in v6.2.0.