ransack icon indicating copy to clipboard operation
ransack copied to clipboard

NoMethodError: undefined method 'join_root' for an instance of Symbol

Open vitaliiorlov opened this issue 2 months ago • 0 comments

Hello,

When I use shared context (https://activerecord-hackery.github.io/ransack/going-further/merging-searches/) And have join, I got such an error:

NoMethodError:
       undefined method 'join_root' for an instance of Symbol
     # /usr/local/bundle/gems/ransack-4.4.1/lib/ransack/adapters/active_record/context.rb:115:in 'Ransack::Adapters::ActiveRecord::Context#join_sources'

How to reproduce:

# Task model or ApplicationRecord
def ransack_test
  shared_context = Ransack::Context.for(Task)

  search_parents = Task.ransack(
    { name_eq: "A" }, context: shared_context
  )

  search_children = Task.ransack(
    { name_eq: "B" }, context: shared_context
  )

  shared_conditions = [search_parents, search_children].map do |search|
    Ransack::Visitor.new.accept(search.base)
  end

  Task.joins(shared_context.join_sources)
    .where(shared_conditions.reduce(&:or))
end
Task.ransack_test
  Task Load (0.2ms)  SELECT "tasks".* FROM "tasks" WHERE ("tasks"."name" = 'A' OR "tasks"."name" = 'B')
[]
Task.joins(:asset).ransack_test
app/models/application_record.rb:33:in 'ApplicationRecord.ransack_test': undefined method 'join_root' for an instance of Symbol (NoMethodError)

        if join_root.match?(oj.join_root) && join_root.table.name == oj.join_root.table.name
                              ^^^^^^^^^^


vitaliiorlov avatar Dec 08 '25 15:12 vitaliiorlov