jwood / tenacity

A database client independent way of managing relationships between models backed by different databases.
MIT License
118 stars 17 forks source link

AR has_many w/ Mongoid belongs_to fails with missing table? #27

Closed thecatwasnot closed 13 years ago

thecatwasnot commented 13 years ago

I've started playing with tenacity in a new rails 3.1 app, interesting idea for sure but I've already blown things up.

I've got a AR User class, which t_has_many :projects, and my Project Mongoid Document with t_belongs_to :user, unfortunately now user creation fails. The error seems to indicate I should have a projects_users table in my AR db, which I do not, nor should I need one, should I? I get the feeling I'm missing something here.

PGError: ERROR:  relation "projects_users" does not exist
LINE 1: delete from projects_users where user_id = 3
                    ^
: delete from projects_users where user_id = 3

Full stack trace:

activerecord (3.1.0.beta1) lib/active_record/connection_adapters/postgresql_adapter.rb:524:in `async_exec'
activerecord (3.1.0.beta1) lib/active_record/connection_adapters/postgresql_adapter.rb:524:in `block in execute'
activerecord (3.1.0.beta1) lib/active_record/connection_adapters/abstract_adapter.rb:222:in `block in log'
activesupport (3.1.0.beta1) lib/active_support/notifications/instrumenter.rb:21:in `instrument'
activerecord (3.1.0.beta1) lib/active_record/connection_adapters/abstract_adapter.rb:217:in `log'
activerecord (3.1.0.beta1) lib/active_record/connection_adapters/postgresql_adapter.rb:523:in `execute'
/home/pixel/.rvm/gems/ruby-1.9.2-p180@scribbler/bundler/gems/tenacity-3be8fc914ee0/lib/tenacity/orm_ext/activerecord.rb:115:in `_t_clear_associates'
/home/pixel/.rvm/gems/ruby-1.9.2-p180@scribbler/bundler/gems/tenacity-3be8fc914ee0/lib/tenacity/associations/has_many.rb:104:in `_t_clear_old_associations'
/home/pixel/.rvm/gems/ruby-1.9.2-p180@scribbler/bundler/gems/tenacity-3be8fc914ee0/lib/tenacity/associations/has_many.rb:88:in `_t_save_associates'
/home/pixel/.rvm/gems/ruby-1.9.2-p180@scribbler/bundler/gems/tenacity-3be8fc914ee0/lib/tenacity/orm_ext/activerecord.rb:90:in `block in _t_initialize_has_many_association'
activesupport (3.1.0.beta1) lib/active_support/callbacks.rb:404:in `_run_save_callbacks'
activesupport (3.1.0.beta1) lib/active_support/callbacks.rb:81:in `run_callbacks'
activerecord (3.1.0.beta1) lib/active_record/callbacks.rb:264:in `create_or_update'
activerecord (3.1.0.beta1) lib/active_record/persistence.rb:36:in `save'
activerecord (3.1.0.beta1) lib/active_record/validations.rb:50:in `save'
activerecord (3.1.0.beta1) lib/active_record/attribute_methods/dirty.rb:22:in `save'
activerecord (3.1.0.beta1) lib/active_record/transactions.rb:241:in `block (2 levels) in save'
activerecord (3.1.0.beta1) lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status'
activerecord (3.1.0.beta1) lib/active_record/connection_adapters/abstract/database_statements.rb:191:in `transaction'
activerecord (3.1.0.beta1) lib/active_record/transactions.rb:208:in `transaction'
activerecord (3.1.0.beta1) lib/active_record/transactions.rb:293:in `with_transaction_returning_status'
activerecord (3.1.0.beta1) lib/active_record/transactions.rb:241:in `block in save'
activerecord (3.1.0.beta1) lib/active_record/transactions.rb:252:in `rollback_active_record_state!'
activerecord (3.1.0.beta1) lib/active_record/transactions.rb:240:in `save'
devise (1.3.4) app/controllers/devise/registrations_controller.rb:16:in `create'
actionpack (3.1.0.beta1) lib/action_controller/metal/implicit_render.rb:5:in `send_action'
actionpack (3.1.0.beta1) lib/abstract_controller/base.rb:155:in `process_action'
actionpack (3.1.0.beta1) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (3.1.0.beta1) lib/abstract_controller/callbacks.rb:18:in `block in process_action'
activesupport (3.1.0.beta1) lib/active_support/callbacks.rb:434:in `_run__60074823__process_action__974536601__callbacks'
activesupport (3.1.0.beta1) lib/active_support/callbacks.rb:386:in `_run_process_action_callbacks'
activesupport (3.1.0.beta1) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (3.1.0.beta1) lib/abstract_controller/callbacks.rb:17:in `process_action'
actionpack (3.1.0.beta1) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action'
activesupport (3.1.0.beta1) lib/active_support/notifications.rb:55:in `block in instrument'
activesupport (3.1.0.beta1) lib/active_support/notifications/instrumenter.rb:21:in `instrument'
activesupport (3.1.0.beta1) lib/active_support/notifications.rb:55:in `instrument'
actionpack (3.1.0.beta1) lib/action_controller/metal/instrumentation.rb:29:in `process_action'
actionpack (3.1.0.beta1) lib/action_controller/metal/params_wrapper.rb:191:in `process_action'
actionpack (3.1.0.beta1) lib/action_controller/metal/rescue.rb:17:in `process_action'
actionpack (3.1.0.beta1) lib/abstract_controller/base.rb:121:in `process'
actionpack (3.1.0.beta1) lib/abstract_controller/rendering.rb:41:in `process'
actionpack (3.1.0.beta1) lib/action_controller/metal.rb:193:in `dispatch'
actionpack (3.1.0.beta1) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
actionpack (3.1.0.beta1) lib/action_controller/metal.rb:236:in `block in action'
actionpack (3.1.0.beta1) lib/action_dispatch/routing/route_set.rb:65:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/routing/route_set.rb:65:in `dispatch'
actionpack (3.1.0.beta1) lib/action_dispatch/routing/route_set.rb:29:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/routing/mapper.rb:41:in `call'
rack-mount (0.7.4) lib/rack/mount/route_set.rb:151:in `block in call'
rack-mount (0.7.4) lib/rack/mount/code_generation.rb:93:in `block in recognize'
rack-mount (0.7.4) lib/rack/mount/code_generation.rb:68:in `optimized_each'
rack-mount (0.7.4) lib/rack/mount/code_generation.rb:92:in `recognize'
rack-mount (0.7.4) lib/rack/mount/route_set.rb:141:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/routing/route_set.rb:528:in `call'
warden (1.0.4) lib/warden/manager.rb:35:in `block in call'
warden (1.0.4) lib/warden/manager.rb:34:in `catch'
warden (1.0.4) lib/warden/manager.rb:34:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
rack (1.3.0) lib/rack/etag.rb:23:in `call'
rack (1.3.0) lib/rack/conditionalget.rb:35:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/middleware/head.rb:14:in `call'
rack (1.3.0) lib/rack/methodoverride.rb:24:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/middleware/params_parser.rb:21:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/middleware/flash.rb:243:in `call'
rack (1.3.0) lib/rack/session/abstract/id.rb:195:in `context'
rack (1.3.0) lib/rack/session/abstract/id.rb:190:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/middleware/cookies.rb:321:in `call'
activerecord (3.1.0.beta1) lib/active_record/query_cache.rb:54:in `call'
activerecord (3.1.0.beta1) lib/active_record/connection_adapters/abstract/connection_pool.rb:448:in `call'
activerecord (3.1.0.beta1) lib/active_record/identity_map.rb:126:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (3.1.0.beta1) lib/active_support/callbacks.rb:392:in `_run_call_callbacks'
activesupport (3.1.0.beta1) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (3.1.0.beta1) lib/action_dispatch/middleware/callbacks.rb:28:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/middleware/reloader.rb:68:in `call'
rack (1.3.0) lib/rack/sendfile.rb:102:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/middleware/show_exceptions.rb:47:in `call'
railties (3.1.0.beta1) lib/rails/rack/logger.rb:13:in `call'
rack (1.3.0) lib/rack/runtime.rb:17:in `call'
activesupport (3.1.0.beta1) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.3.0) lib/rack/lock.rb:34:in `call'
actionpack (3.1.0.beta1) lib/action_dispatch/middleware/static.rb:53:in `call'
railties (3.1.0.beta1) lib/rails/engine.rb:438:in `call'
railties (3.1.0.beta1) lib/rails/rack/log_tailer.rb:14:in `call'
rack (1.3.0) lib/rack/handler/webrick.rb:59:in `service'
/home/pixel/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'
/home/pixel/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'
/home/pixel/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread'

I'm certainly willing to admit defeat if it's AR 3.1 that is the culprit, but from poking around tenacity's source it doesn't seem so.

jwood commented 13 years ago

Hi, and thanks for the bug report.

While the join table currently is required for t_has_many associations from a relational database backed object to another object, it is largely unnecessary. I took a look at the code (it's been a while since I wrote that piece), and it appears to only use the join table to fetch the ids of the associated objects. This can just as easily be done by calling the associated class' _t_find_all_by_associate method.

Until I can make this change, you'll have to create a join table following ActiveRecord conventions. See http://rdoc.info/github/jwood/tenacity/master/Tenacity/OrmExt/ActiveRecord for details. Once fixed, you should be able to simply drop the join table.

I should be able to get this fixed within the next couple of weeks.

thecatwasnot commented 13 years ago

Thanks for the prompt response & neat project, will do!

jwood commented 13 years ago

No problem at all. Please don't hesitate to keep the bug reports coming if you run into any other issues.

jwood commented 13 years ago

This is fixed in master, and will go out with the next release.

thecatwasnot commented 13 years ago

Thanks! I grabbed master and have tried it, looks fantastic, and even fixes some weird behaviour I was seeing :)