Skip to content

Multiple Issues with composite primary keys #4108

@smathieu

Description

@smathieu

Describe the bug

When a model uses a composite primary key, several things starts breaking in Avo. It seems like finders aren't used consistently in caching and action (and maybe other areas)

Reproduction repository for the bug

https://github.com/tangibleMaterials/avo-reproduction/tree/composite-fk

Steps to use in the reproduction repository

Steps to reproduce the behavior:

  1. Run the seed
  2. Click on a 'course enrollment'
  3. Crash
  
ActiveRecord::RecordNotFound (Couldn't find CourseEnrollment with '["course_id", "student_id"]'="102_3"):
  
activerecord (8.0.3) lib/active_record/core.rb:280:in 'ActiveRecord::Core::ClassMethods#find'
avo (3.25.2) lib/avo/resources/base.rb:87:in 'block in <class:Base>'
avo (3.25.2) lib/avo/execution_context.rb:69:in 'BasicObject#instance_exec'
avo (3.25.2) lib/avo/execution_context.rb:69:in 'Avo::ExecutionContext#handle'
avo (3.25.2) lib/avo/resources/base.rb:253:in 'Avo::Resources::Base.find_record'
avo (3.25.2) lib/avo/resources/base.rb:276:in 'Avo::Resources::Base#find_record'
avo (3.25.2) app/controllers/avo/associations_controller.rb:25:in 'Avo::AssociationsController#index'
actionpack (8.0.3) lib/action_controller/metal/basic_implicit_render.rb:8:in 'ActionController::BasicImplicitRender#send_action'
actionpack (8.0.3) lib/abstract_controller/base.rb:215:in 'AbstractController::Base#process_action'
actionpack (8.0.3) lib/action_controller/metal/rendering.rb:193:in 'ActionController::Rendering#process_action'
actionpack (8.0.3) lib/abstract_controller/callbacks.rb:261:in 'block in AbstractController::Callbacks#process_action'
activesupport (8.0.3) lib/active_support/callbacks.rb:120:in 'block in ActiveSupport::Callbacks#run_callbacks'
i18n (1.14.7) lib/i18n.rb:353:in 'I18n::Base#with_locale'
avo (3.25.2) app/controllers/avo/base_application_controller.rb:271:in 'Avo::BaseApplicationController#set_avo_locale'
activesupport (8.0.3) lib/active_support/callbacks.rb:129:in 'block in ActiveSupport::Callbacks#run_callbacks'
turbo-rails (2.0.17) lib/turbo-rails.rb:24:in 'Turbo.with_request_id'
turbo-rails (2.0.17) app/controllers/concerns/turbo/request_id_tracking.rb:10:in 'Turbo::RequestIdTracking#turbo_tracking_request_id'
activesupport (8.0.3) lib/active_support/callbacks.rb:129:in 'block in ActiveSupport::Callbacks#run_callbacks'
actiontext (8.0.3) lib/action_text/rendering.rb:25:in 'ActionText::Rendering::ClassMethods#with_renderer'
actiontext (8.0.3) lib/action_text/engine.rb:71:in 'block (4 levels) in <class:Engine>'
activesupport (8.0.3) lib/active_support/callbacks.rb:129:in 'BasicObject#instance_exec'
activesupport (8.0.3) lib/active_support/callbacks.rb:129:in 'block in ActiveSupport::Callbacks#run_callbacks'
activesupport (8.0.3) lib/active_support/callbacks.rb:140:in 'ActiveSupport::Callbacks#run_callbacks'
actionpack (8.0.3) lib/abstract_controller/callbacks.rb:260:in 'AbstractController::Callbacks#process_action'
actionpack (8.0.3) lib/action_controller/metal/rescue.rb:27:in 'ActionController::Rescue#process_action'
actionpack (8.0.3) lib/action_controller/metal/instrumentation.rb:76:in 'block in ActionController::Instrumentation#process_action'
activesupport (8.0.3) lib/active_support/notifications.rb:210:in 'block in ActiveSupport::Notifications.instrument'
activesupport (8.0.3) lib/active_support/notifications/instrumenter.rb:58:in 'ActiveSupport::Notifications::Instrumenter#instrument'
activesupport (8.0.3) lib/active_support/notifications.rb:210:in 'ActiveSupport::Notifications.instrument'
actionpack (8.0.3) lib/action_controller/metal/instrumentation.rb:75:in 'ActionController::Instrumentation#process_action'
actionpack (8.0.3) lib/action_controller/metal/params_wrapper.rb:259:in 'ActionController::ParamsWrapper#process_action'
activerecord (8.0.3) lib/active_record/railties/controller_runtime.rb:39:in 'ActiveRecord::Railties::ControllerRuntime#process_action'
actionpack (8.0.3) lib/abstract_controller/base.rb:152:in 'AbstractController::Base#process'
actionview (8.0.3) lib/action_view/rendering.rb:40:in 'ActionView::Rendering#process'
actionpack (8.0.3) lib/action_controller/metal.rb:252:in 'ActionController::Metal#dispatch'
actionpack (8.0.3) lib/action_controller/metal.rb:335:in 'ActionController::Metal.dispatch'
actionpack (8.0.3) lib/action_dispatch/routing/route_set.rb:67:in 'ActionDispatch::Routing::RouteSet::Dispatcher#dispatch'
actionpack (8.0.3) lib/action_dispatch/routing/route_set.rb:50:in 'ActionDispatch::Routing::RouteSet::Dispatcher#serve'
actionpack (8.0.3) lib/action_dispatch/journey/router.rb:53:in 'block in ActionDispatch::Journey::Router#serve'
actionpack (8.0.3) lib/action_dispatch/journey/router.rb:133:in 'block in ActionDispatch::Journey::Router#find_routes'
actionpack (8.0.3) lib/action_dispatch/journey/router.rb:126:in 'Array#each'
actionpack (8.0.3) lib/action_dispatch/journey/router.rb:126:in 'ActionDispatch::Journey::Router#find_routes'
actionpack (8.0.3) lib/action_dispatch/journey/router.rb:34:in 'ActionDispatch::Journey::Router#serve'
actionpack (8.0.3) lib/action_dispatch/routing/route_set.rb:908:in 'ActionDispatch::Routing::RouteSet#call'
railties (8.0.3) lib/rails/engine/lazy_route_set.rb:60:in 'Rails::Engine::LazyRouteSet#call'
railties (8.0.3) lib/rails/engine.rb:535:in 'Rails::Engine#call'
railties (8.0.3) lib/rails/railtie.rb:226:in 'Kernel#public_send'
railties (8.0.3) lib/rails/railtie.rb:226:in 'Rails::Railtie.method_missing'
actionpack (8.0.3) lib/action_dispatch/routing/mapper.rb:33:in 'block in <class:Constraints>'
actionpack (8.0.3) lib/action_dispatch/routing/mapper.rb:62:in 'ActionDispatch::Routing::Mapper::Constraints#serve'
actionpack (8.0.3) lib/action_dispatch/journey/router.rb:53:in 'block in ActionDispatch::Journey::Router#serve'
actionpack (8.0.3) lib/action_dispatch/journey/router.rb:133:in 'block in ActionDispatch::Journey::Router#find_routes'
actionpack (8.0.3) lib/action_dispatch/journey/router.rb:126:in 'Array#each'
actionpack (8.0.3) lib/action_dispatch/journey/router.rb:126:in 'ActionDispatch::Journey::Router#find_routes'
actionpack (8.0.3) lib/action_dispatch/journey/router.rb:34:in 'ActionDispatch::Journey::Router#serve'
actionpack (8.0.3) lib/action_dispatch/routing/route_set.rb:908:in 'ActionDispatch::Routing::RouteSet#call'
railties (8.0.3) lib/rails/engine/lazy_route_set.rb:60:in 'Rails::Engine::LazyRouteSet#call'
rack (3.2.3) lib/rack/static.rb:162:in 'Rack::Static#call'
rack (3.2.3) lib/rack/static.rb:162:in 'Rack::Static#call'
rack (3.2.3) lib/rack/static.rb:162:in 'Rack::Static#call'
rack (3.2.3) lib/rack/tempfile_reaper.rb:20:in 'Rack::TempfileReaper#call'
rack (3.2.3) lib/rack/etag.rb:29:in 'Rack::ETag#call'
rack (3.2.3) lib/rack/conditional_get.rb:31:in 'Rack::ConditionalGet#call'
rack (3.2.3) lib/rack/head.rb:15:in 'Rack::Head#call'
actionpack (8.0.3) lib/action_dispatch/http/permissions_policy.rb:38:in 'ActionDispatch::PermissionsPolicy::Middleware#call'
actionpack (8.0.3) lib/action_dispatch/http/content_security_policy.rb:38:in 'ActionDispatch::ContentSecurityPolicy::Middleware#call'
rack-session (2.1.1) lib/rack/session/abstract/id.rb:274:in 'Rack::Session::Abstract::Persisted#context'
rack-session (2.1.1) lib/rack/session/abstract/id.rb:268:in 'Rack::Session::Abstract::Persisted#call'
actionpack (8.0.3) lib/action_dispatch/middleware/cookies.rb:706:in 'ActionDispatch::Cookies#call'
activerecord (8.0.3) lib/active_record/migration.rb:670:in 'ActiveRecord::Migration::CheckPending#call'
actionpack (8.0.3) lib/action_dispatch/middleware/callbacks.rb:31:in 'block in ActionDispatch::Callbacks#call'
activesupport (8.0.3) lib/active_support/callbacks.rb:100:in 'ActiveSupport::Callbacks#run_callbacks'
actionpack (8.0.3) lib/action_dispatch/middleware/callbacks.rb:30:in 'ActionDispatch::Callbacks#call'
actionpack (8.0.3) lib/action_dispatch/middleware/executor.rb:16:in 'ActionDispatch::Executor#call'
actionpack (8.0.3) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in 'ActionDispatch::ActionableExceptions#call'
actionpack (8.0.3) lib/action_dispatch/middleware/debug_exceptions.rb:31:in 'ActionDispatch::DebugExceptions#call'
web-console (4.2.1) lib/web_console/middleware.rb:132:in 'WebConsole::Middleware#call_app'
web-console (4.2.1) lib/web_console/middleware.rb:28:in 'block in WebConsole::Middleware#call'
web-console (4.2.1) lib/web_console/middleware.rb:17:in 'Kernel#catch'
web-console (4.2.1) lib/web_console/middleware.rb:17:in 'WebConsole::Middleware#call'
actionpack (8.0.3) lib/action_dispatch/middleware/show_exceptions.rb:32:in 'ActionDispatch::ShowExceptions#call'
railties (8.0.3) lib/rails/rack/logger.rb:41:in 'Rails::Rack::Logger#call_app'
railties (8.0.3) lib/rails/rack/logger.rb:29:in 'Rails::Rack::Logger#call'
actionpack (8.0.3) lib/action_dispatch/middleware/remote_ip.rb:96:in 'ActionDispatch::RemoteIp#call'
actionpack (8.0.3) lib/action_dispatch/middleware/request_id.rb:34:in 'ActionDispatch::RequestId#call'
rack (3.2.3) lib/rack/method_override.rb:28:in 'Rack::MethodOverride#call'
rack (3.2.3) lib/rack/runtime.rb:24:in 'Rack::Runtime#call'
actionpack (8.0.3) lib/action_dispatch/middleware/server_timing.rb:61:in 'block in ActionDispatch::ServerTiming#call'
actionpack (8.0.3) lib/action_dispatch/middleware/server_timing.rb:26:in 'ActionDispatch::ServerTiming::Subscriber#collect_events'
actionpack (8.0.3) lib/action_dispatch/middleware/server_timing.rb:60:in 'ActionDispatch::ServerTiming#call'
actionpack (8.0.3) lib/action_dispatch/middleware/executor.rb:16:in 'ActionDispatch::Executor#call'
propshaft (1.3.1) lib/propshaft/server.rb:37:in 'Propshaft::Server#call'
actionpack (8.0.3) lib/action_dispatch/middleware/static.rb:27:in 'ActionDispatch::Static#call'
rack (3.2.3) lib/rack/sendfile.rb:131:in 'Rack::Sendfile#call'
actionpack (8.0.3) lib/action_dispatch/middleware/host_authorization.rb:143:in 'ActionDispatch::HostAuthorization#call'
railties (8.0.3) lib/rails/engine.rb:535:in 'Rails::Engine#call'
puma (7.1.0) lib/puma/configuration.rb:300:in 'Puma::Configuration::ConfigMiddleware#call'
puma (7.1.0) lib/puma/request.rb:101:in 'block in Puma::Request#handle_request'
puma (7.1.0) lib/puma/thread_pool.rb:355:in 'Puma::ThreadPool#with_force_shutdown'
puma (7.1.0) lib/puma/request.rb:100:in 'Puma::Request#handle_request'
puma (7.1.0) lib/puma/server.rb:503:in 'Puma::Server#process_client'
puma (7.1.0) lib/puma/server.rb:262:in 'block in Puma::Server#run'
puma (7.1.0) lib/puma/thread_pool.rb:182:in 'block in Puma::ThreadPool#spawn_thread'

Another issue we're seeing in our main app, but I'm still failing to reproduce here (I'll create a another ticket with better steps if needed), are the actions are also failing to find resources correctly. I suspect this is a postgres only issue.

Expected behavior & Actual behavior

Composite primary keys should be fully supported by Avo.

System configuration

Avo version: latest

Rails version: latest

Ruby version: latest

License type:

  • Community
  • Pro
  • Advanced

Are you using Avo monkey patches, overriding views or view components?

  • Yes. If so, please post code samples.
  • [x No

Screenshots or screen recordings

Additional context

Impact

  • High impact (It makes my app un-usable.)
  • Medium impact (I'm annoyed, but I'll live.)
  • Low impact (It's really a tiny thing that I could live with.)

Urgency

  • High urgency (I can't continue development without it.)
  • Medium urgency (I found a workaround, but I'd love to have it fixed.)
  • Low urgency (It can wait. I just wanted you to know about it.)

Metadata

Metadata

Assignees

Labels

Type

No fields configured for Bug.

Projects

Status
To Do

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions