Моя Rails Aplication начинает поднимать ActiveRecord :: ImmutableRelation в некоторых случайных запросах - PullRequest
2 голосов
/ 23 мая 2019

со вчерашнего дня мое производственное приложение начинает поднимать ActiveRecord::ImmutableRelation в некоторых запросах всего моего приложения!

Я не могу себе представить, как дать точный контекст каждой ошибки, поскольку эта ошибка возникает в случайных местахмоего приложения!Я не могу смоделировать эти ошибки, вызывая один и тот же блок кода в Rails Console, только в контроллерах в производственной среде.

Мы не меняем ни одного запроса, я начинаю думать, что это может быть ошибка или какой-то другойизменить конфигурацию базы данных (?).Кто-то уже получил эти ошибки?Любая идея, что я могу искать?

Backtrace (с одной ошибкой):

ActiveRecord::ImmutableRelation: ActiveRecord::ImmutableRelation
  from active_record/relation/query_methods.rb:923:in `assert_mutability!'
  from active_record/relation/query_methods.rb:915:in `set_value'
  from active_record/relation/query_methods.rb:74:in `references_values='
  from active_record/relation/query_methods.rb:176:in `references!'
  from active_record/relation/merger.rb:76:in `block in merge'
  from active_record/relation/merger.rb:66:in `each'
  from active_record/relation/merger.rb:66:in `merge'
  from active_record/relation/spawn_methods.rb:45:in `merge!'
  from octopus/relation_proxy.rb:49:in `public_send'
  from octopus/relation_proxy.rb:49:in `block in method_missing'
  from octopus/proxy.rb:86:in `block (2 levels) in run_queries_on_shard'
  from octopus/proxy.rb:345:in `using_shard'
  from octopus/proxy.rb:85:in `block in run_queries_on_shard'
  from octopus/proxy.rb:329:in `keeping_connection_proxy'
  from octopus/proxy.rb:84:in `run_queries_on_shard'
  from octopus/shard_tracking.rb:31:in `run_on_shard'
  from octopus/relation_proxy.rb:45:in `method_missing'
  from active_record/associations/association.rb:79:in `scope'
  from active_record/associations/collection_association.rb:288:in `scope'
  from active_record/associations/collection_proxy.rb:960:in `scope'
  from active_record/associations/collection_proxy.rb:1130:in `order'
  from octopus/relation_proxy.rb:49:in `public_send'
  from octopus/relation_proxy.rb:49:in `block in method_missing'
  from octopus/proxy.rb:86:in `block (2 levels) in run_queries_on_shard'
  from octopus/proxy.rb:345:in `using_shard'
  from octopus/proxy.rb:85:in `block in run_queries_on_shard'
  from octopus/proxy.rb:329:in `keeping_connection_proxy'
  from octopus/proxy.rb:84:in `run_queries_on_shard'
  from octopus/shard_tracking.rb:31:in `run_on_shard'
  from octopus/relation_proxy.rb:45:in `method_missing'
  from app/controllers/v2/app/details_controller.rb:9:in `show'
  from action_controller/metal/basic_implicit_render.rb:6:in `send_action'
  from abstract_controller/base.rb:194:in `process_action'
  from scout_apm/instruments/action_controller_rails_3_rails4.rb:72:in `process_action'
  from action_controller/metal/rendering.rb:30:in `process_action'
  from abstract_controller/callbacks.rb:42:in `block in process_action'
  from active_support/callbacks.rb:109:in `block in run_callbacks'
  from raven/integrations/rails/controller_transaction.rb:7:in `block in included'
  from active_support/callbacks.rb:118:in `instance_exec'
  from active_support/callbacks.rb:118:in `block in run_callbacks'
  from active_support/callbacks.rb:136:in `run_callbacks'
  from abstract_controller/callbacks.rb:41:in `process_action'
  from action_controller/metal/rescue.rb:22:in `process_action'
  from action_controller/metal/instrumentation.rb:34:in `block in process_action'
  from active_support/notifications.rb:168:in `block in instrument'
  from active_support/notifications/instrumenter.rb:23:in `instrument'
  from active_support/notifications.rb:168:in `instrument'
  from action_controller/metal/instrumentation.rb:32:in `process_action'
  from action_controller/metal/params_wrapper.rb:256:in `process_action'
  from active_record/railties/controller_runtime.rb:24:in `process_action'
  from scout_apm/instruments/action_controller_rails_3_rails4.rb:94:in `process_action'
  from abstract_controller/base.rb:134:in `process'
  from action_controller/metal.rb:191:in `dispatch'
  from action_controller/metal.rb:252:in `dispatch'
  from action_dispatch/routing/route_set.rb:52:in `dispatch'
  from action_dispatch/routing/route_set.rb:34:in `serve'
  from action_dispatch/journey/router.rb:52:in `block in serve'
  from action_dispatch/journey/router.rb:35:in `each'
  from action_dispatch/journey/router.rb:35:in `serve'
  from action_dispatch/routing/route_set.rb:840:in `call'
  from scout_apm/instruments/rails_router.rb:29:in `call_with_scout_instruments'
  from rails_api_utils/middleware/context_collect.rb:18:in `call'
  from rails_api_utils/middleware/localization.rb:29:in `block (2 levels) in call'
  from active_support/core_ext/time/zones.rb:66:in `use_zone'
  from rails_api_utils/middleware/localization.rb:39:in `in_timezone'
  from rails_api_utils/middleware/localization.rb:28:in `block in call'
  from i18n.rb:297:in `with_locale'
  from rails_api_utils/middleware/localization.rb:43:in `with_locale'
  from rails_api_utils/middleware/localization.rb:27:in `call'
  from rack/request_id.rb:30:in `block in call'
  from request_id.rb:60:in `with'
  from rack/request_id.rb:29:in `call'
  from scout_apm/middleware.rb:17:in `call'
  from request_store/middleware.rb:9:in `call'
  from rack/etag.rb:25:in `call'
  from rack/conditional_get.rb:25:in `call'
  from rack/head.rb:12:in `call'
  from action_dispatch/middleware/callbacks.rb:28:in `block in call'
  from active_support/callbacks.rb:98:in `run_callbacks'
  from action_dispatch/middleware/callbacks.rb:26:in `call'
  from enterprise/trace_id/middlewares/rack_middleware.rb:21:in `block in call'
  from enterprise/trace_id/tracer/tracer.rb:13:in `block in trace'
  from <internal:prelude>:137:in `__enable'
  from <internal:prelude>:137:in `enable'
  from enterprise/trace_id/tracer/tracer.rb:13:in `trace'
  from enterprise/trace_id/middlewares/rack_middleware.rb:21:in `call'
  from action_dispatch/middleware/debug_exceptions.rb:61:in `call'
  from action_dispatch/middleware/show_exceptions.rb:33:in `call'
  from rails/rack/logger.rb:38:in `call_app'
  from rails/rack/logger.rb:26:in `block in call'
  from active_support/tagged_logging.rb:71:in `block in tagged'
  from active_support/tagged_logging.rb:28:in `tagged'
  from active_support/tagged_logging.rb:71:in `tagged'
  from rails/rack/logger.rb:26:in `call'
  from action_dispatch/middleware/remote_ip.rb:81:in `call'
  from request_store/middleware.rb:9:in `call'
  from action_dispatch/middleware/request_id.rb:27:in `call'
  from rack/runtime.rb:22:in `call'
  from active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
  from action_dispatch/middleware/executor.rb:14:in `call'
  from rack/sendfile.rb:111:in `call'
  from raven/integrations/rack.rb:51:in `call'
  from scout_apm/instruments/middleware_summary.rb:58:in `call'
  from rails/engine.rb:524:in `call'
  from puma/configuration.rb:225:in `call'
  from puma/server.rb:658:in `handle_request'
  from puma/server.rb:472:in `process_client'
  from puma/server.rb:332:in `block in run'
  from puma/thread_pool.rb:133:in `block in spawn_thread'

Подробный код контроллера (я пропустил некоторые названия моделей предприятий):

# frozen_string_literal: true
class DetailsController < V2::ApplicationController
  def show
    model = Model.find(params[:pricing_id])
    details = model.details.order(:position)
    details.each { |detail| detail.model = model }
    Detail.cascade_formula_arguments(details, params)
    details = details.select(&:available?)

    render json: details, each_serializer: ::V2::DetailSerializer
  end
end

1 Ответ

0 голосов
/ 23 мая 2019

Если вы не хотите изменять данные, я бы предложил сопоставить их с массивом хэшей ... но не уверен, что делает Detail.cascade_formula_arguments(details, params), поэтому это предположение.

Я бы попытался преобразовать данные в хеш вместо объекта активной записи, если вы действительно не пытаетесь изменить их так, что-то вроде этого:

details.each { |detail| detail.model = model }
details = details.map(&:as_json)

Обновлено

Основываясь на комментариях @engineersmnky и моей собственной мысли, что эта строка кода, вероятно, является вашей проблемой, вы можете просто удалить эту строку кода? Какова его цель? Посмотрим, сможете ли вы удалить его.

# try to remove this from your code
details.each { |detail| detail.model = model }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...