ransack icon indicating copy to clipboard operation
ransack copied to clipboard

All negative search in deep join not working

Open skyskyworth opened this issue 3 years ago • 2 comments

class Customer < ApplicationRecord
  acts_as_taggable
end

Gemfile.lock part

    acts-as-taggable-on (= 8.1.0)
    rails (6.1.4)
      actioncable (= 6.1.4)
      actionmailbox (= 6.1.4)
      actionmailer (= 6.1.4)
      actionpack (= 6.1.4)
      actiontext (= 6.1.4)
      actionview (= 6.1.4)
      activejob (= 6.1.4)
      activemodel (= 6.1.4)
      activerecord (= 6.1.4)
      activestorage (= 6.1.4)
      activesupport (= 6.1.4)
      bundler (>= 1.15.0)
      railties (= 6.1.4)
    ransack (2.4.2)
      activerecord (>= 5.2.4)
      activesupport (>= 5.2.4)
      i18n
  • not_eq
irb(main):017:0> Customer.ransack({"tags_name_not_eq"=>'test'}).result
Traceback (most recent call last):
        1: from (irb):17
NoMethodError (undefined method `eq' for nil:NilClass)
  • eq
irb(main):019:0> Customer.ransack({"tags_name_eq"=>"test"}).result
  Customer Load (0.5ms)  SELECT `customers`.* FROM `customers` LEFT OUTER JOIN `taggings` ON `taggings`.`taggable_type` = 'Customer' AND `taggings`.`context` = 'tags' AND `taggings`.`taggable_id` = `customers`.`id` LEFT OUTER JOIN `tags` ON `tags`.`id` = `taggings`.`tag_id` WHERE `tags`.`name` = 'test' /* loading for inspect */ LIMIT 11
  • not_in
irb(main):021:0> Customer.ransack({"tags_name_not_in"=>["test"]}).result
Traceback (most recent call last):
        2: from (irb):21
        1: from (irb):21:in `rescue in irb_binding'
NoMethodError (undefined method `eq' for nil:NilClass)
  • in
irb(main):022:0> Customer.ransack({"tags_name_in"=>["test"]}).result
    Customer Load (0.5ms)  SELECT `customers`.* FROM `customers` LEFT OUTER JOIN `taggings` ON `taggings`.`taggable_type` = 'Customer' AND `taggings`.`context` = 'tags' AND `taggings`.`taggable_id` = `customers`.`id` LEFT OUTER JOIN `tags` ON `tags`.`id` = `taggings`.`tag_id` WHERE `tags`.`name` IN ('test') /* loading for inspect */ LIMIT 11
Full backtrace when ransack in controller
--------------

 - ransack (2.4.2) lib/ransack/adapters/active_record/context.rb:174:in `build_correlated_subquery'
 - ransack (2.4.2) lib/ransack/adapters/active_record/ransack/nodes/condition.rb:9:in `block in arel_predicate'
 - ransack (2.4.2) lib/ransack/adapters/active_record/ransack/nodes/condition.rb:6:in `arel_predicate'
 - ransack (2.4.2) lib/ransack/visitor.rb:17:in `visit_Ransack_Nodes_Condition'
 - ransack (2.4.2) lib/ransack/visitor.rb:42:in `visit'
 - ransack (2.4.2) lib/ransack/visitor.rb:5:in `accept'
 - ransack (2.4.2) lib/ransack/adapters/active_record/ransack/visitor.rb:4:in `block in visit_and'
 - ransack (2.4.2) lib/ransack/adapters/active_record/ransack/visitor.rb:4:in `visit_and'
 - ransack (2.4.2) lib/ransack/visitor.rb:24:in `visit_Ransack_Nodes_Grouping'
 - ransack (2.4.2) lib/ransack/visitor.rb:42:in `visit'
 - ransack (2.4.2) lib/ransack/visitor.rb:5:in `accept'
 - ransack (2.4.2) lib/ransack/adapters/active_record/context.rb:26:in `evaluate'
 - ransack (2.4.2) lib/ransack/search.rb:38:in `result'
 - app/helpers/crm/application_helper.rb:25:in `inquiry_collection'
 - app/controllers/crm/inquiries_controller.rb:42:in `index'
 - actionpack (6.1.4) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
 - actionpack (6.1.4) lib/abstract_controller/base.rb:228:in `process_action'
 - actionpack (6.1.4) lib/action_controller/metal/rendering.rb:30:in `process_action'
 - actionpack (6.1.4) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
 - activesupport (6.1.4) lib/active_support/callbacks.rb:117:in `block in run_callbacks'
 - activesupport (6.1.4) lib/active_support/callbacks.rb:137:in `run_callbacks'
 - actionpack (6.1.4) lib/abstract_controller/callbacks.rb:41:in `process_action'
 - actionpack (6.1.4) lib/action_controller/metal/rescue.rb:22:in `process_action'
 - actionpack (6.1.4) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
 - activesupport (6.1.4) lib/active_support/notifications.rb:203:in `block in instrument'
 - activesupport (6.1.4) lib/active_support/notifications/instrumenter.rb:24:in `instrument'
 - activesupport (6.1.4) lib/active_support/notifications.rb:203:in `instrument'
 - actionpack (6.1.4) lib/action_controller/metal/instrumentation.rb:33:in `process_action'
 - actionpack (6.1.4) lib/action_controller/metal/params_wrapper.rb:249:in `process_action'
 - activerecord (6.1.4) lib/active_record/railties/controller_runtime.rb:27:in `process_action'
 - actionpack (6.1.4) lib/abstract_controller/base.rb:165:in `process'
 - actionview (6.1.4) lib/action_view/rendering.rb:39:in `process'
 - actionpack (6.1.4) lib/action_controller/metal.rb:190:in `dispatch'
 - actionpack (6.1.4) lib/action_controller/metal.rb:254:in `dispatch'
 - actionpack (6.1.4) lib/action_dispatch/routing/route_set.rb:50:in `dispatch'
 - actionpack (6.1.4) lib/action_dispatch/routing/route_set.rb:33:in `serve'
 - actionpack (6.1.4) lib/action_dispatch/journey/router.rb:50:in `block in serve'
 - actionpack (6.1.4) lib/action_dispatch/journey/router.rb:32:in `serve'
 - actionpack (6.1.4) lib/action_dispatch/routing/route_set.rb:842:in `call'
 - omniauth (1.9.1) lib/omniauth/strategy.rb:192:in `call!'
 - omniauth (1.9.1) lib/omniauth/strategy.rb:169:in `call'
 - omniauth (1.9.1) lib/omniauth/strategy.rb:192:in `call!'
 - omniauth (1.9.1) lib/omniauth/strategy.rb:169:in `call'
 - sentry-rails (4.4.0) lib/sentry/rails/rescued_exception_interceptor.rb:12:in `call'
 - warden (1.2.9) lib/warden/manager.rb:36:in `block in call'
 - warden (1.2.9) lib/warden/manager.rb:34:in `call'
 - rack (2.2.3) lib/rack/tempfile_reaper.rb:15:in `call'
 - rack (2.2.3) lib/rack/etag.rb:27:in `call'
 - rack (2.2.3) lib/rack/conditional_get.rb:40:in `call'
 - rack (2.2.3) lib/rack/head.rb:12:in `call'
 - actionpack (6.1.4) lib/action_dispatch/http/permissions_policy.rb:22:in `call'
 - actionpack (6.1.4) lib/action_dispatch/http/content_security_policy.rb:18:in `call'
 - rack (2.2.3) lib/rack/session/abstract/id.rb:266:in `context'
 - rack (2.2.3) lib/rack/session/abstract/id.rb:260:in `call'
 - actionpack (6.1.4) lib/action_dispatch/middleware/cookies.rb:689:in `call'
 - activerecord (6.1.4) lib/active_record/migration.rb:601:in `call'
 - actionpack (6.1.4) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
 - activesupport (6.1.4) lib/active_support/callbacks.rb:98:in `run_callbacks'
 - actionpack (6.1.4) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
 - actionpack (6.1.4) lib/action_dispatch/middleware/executor.rb:14:in `call'
 - actionpack (6.1.4) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'
 - better_errors (2.9.1) lib/better_errors/middleware.rb:87:in `protected_app_call'
 - better_errors (2.9.1) lib/better_errors/middleware.rb:82:in `better_errors_call'
 - better_errors (2.9.1) lib/better_errors/middleware.rb:60:in `call'
 - actionpack (6.1.4) lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'
 - actionpack (6.1.4) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
 - railties (6.1.4) lib/rails/rack/logger.rb:37:in `call_app'
 - railties (6.1.4) lib/rails/rack/logger.rb:26:in `block in call'
 - activesupport (6.1.4) lib/active_support/tagged_logging.rb:99:in `block in tagged'
 - activesupport (6.1.4) lib/active_support/tagged_logging.rb:37:in `tagged'
 - activesupport (6.1.4) lib/active_support/tagged_logging.rb:99:in `tagged'
 - railties (6.1.4) lib/rails/rack/logger.rb:26:in `call'
 - actionpack (6.1.4) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
 - actionpack (6.1.4) lib/action_dispatch/middleware/request_id.rb:26:in `call'
 - rack (2.2.3) lib/rack/method_override.rb:24:in `call'
 - rack (2.2.3) lib/rack/runtime.rb:22:in `call'
 - activesupport (6.1.4) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
 - sentry-ruby-core (4.4.2) lib/sentry/rack/capture_exceptions.rb:23:in `block in call'
 - sentry-ruby-core (4.4.2) lib/sentry/hub.rb:56:in `with_scope'
 - sentry-ruby-core (4.4.2) lib/sentry-ruby.rb:165:in `with_scope'
 - sentry-ruby-core (4.4.2) lib/sentry/rack/capture_exceptions.rb:14:in `call'
 - actionpack (6.1.4) lib/action_dispatch/middleware/executor.rb:14:in `call'
 - actionpack (6.1.4) lib/action_dispatch/middleware/static.rb:24:in `call'
 - rack (2.2.3) lib/rack/sendfile.rb:110:in `call'
 - actionpack (6.1.4) lib/action_dispatch/middleware/host_authorization.rb:92:in `call'
 - webpacker (5.4.0) lib/webpacker/dev_server_proxy.rb:25:in `perform_request'
 - rack-proxy (0.7.0) lib/rack/proxy.rb:63:in `call'
 - railties (6.1.4) lib/rails/engine.rb:539:in `call'
 - puma (5.3.1) lib/puma/configuration.rb:249:in `call'
 - puma (5.3.1) lib/puma/request.rb:76:in `block in handle_request'
 - puma (5.3.1) lib/puma/thread_pool.rb:338:in `with_force_shutdown'
 - puma (5.3.1) lib/puma/request.rb:75:in `handle_request'
 - puma (5.3.1) lib/puma/server.rb:437:in `process_client'
 - puma (5.3.1) lib/puma/thread_pool.rb:145:in `block in spawn_thread'

related issues: https://github.com/activerecord-hackery/ransack/issues/925

skyskyworth avatar Jul 05 '21 03:07 skyskyworth

I think I found the issue, not sure, but if I change in the Context#extract_correlated_key to detect children its working..

when Arel::Nodes::And
            if join_root.children.any?
              join_root.children.each do |child|
                eck = extract_correlated_key(child)
                return eck unless eck.nil?
              end
            else
              extract_correlated_key(join_root.left) || extract_correlated_key(join_root.right)
            end

ciihla avatar Dec 01 '21 10:12 ciihla

i have same issue

thanhhiep206 avatar Mar 22 '24 10:03 thanhhiep206