{"record":{"id":"b54a3b2d6d146e57","repo":"ankane/searchkick","slug":"the-conversions-option-is-deprecated-in-favor-of","errorCode":null,"errorMessage":"The `conversions` option is deprecated in favor of `conversions_v2`, which provides much better search performance. Upgrade to `conversions_v2` or rename `conversions` to `conversions_v1`","messagePattern":"The `conversions` option is deprecated in favor of `conversions_v2`, which provides much better search performance\\. Upgrade to `conversions_v2` or rename `conversions` to `conversions_v1`","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"lib/searchkick/model.rb","lineNumber":7,"sourceCode":"module Searchkick\n  module Model\n    def searchkick(**options)\n      options = Searchkick.model_options.deep_merge(options)\n\n      if options[:conversions]\n        Searchkick.warn(\"The `conversions` option is deprecated in favor of `conversions_v2`, which provides much better search performance. Upgrade to `conversions_v2` or rename `conversions` to `conversions_v1`\")\n      end\n\n      if options.key?(:conversions_v1)\n        options[:conversions] = options.delete(:conversions_v1)\n      end\n\n      unknown_keywords = options.keys - [:_all, :_type, :batch_size, :callbacks, :callback_options, :case_sensitive, :conversions, :conversions_v2, :deep_paging, :default_fields,\n        :filterable, :geo_shape, :highlight, :ignore_above, :index_name, :index_prefix, :inheritance, :job_options, :knn, :language,\n        :locations, :mappings, :match, :max_result_window, :merge_mappings, :routing, :searchable, :search_synonyms, :settings, :similarity,\n        :special_characters, :stem, :stemmer, :stem_conversions, :stem_exclusion, :stemmer_override, :suggest, :synonyms, :text_end,\n        :text_middle, :text_start, :unscope, :word, :word_end, :word_middle, :word_start]\n      raise ArgumentError, \"unknown keywords: #{unknown_keywords.join(\", \")}\" if unknown_keywords.any?\n\n      raise \"Only call searchkick once per model\" if respond_to?(:searchkick_index)\n\n      Searchkick.models << self\n\n      options[:_type] ||= -> { searchkick_index.klass_document_type(self, true) }","sourceCodeStart":1,"sourceCodeEnd":25,"githubUrl":"https://github.com/ankane/searchkick/blob/93e901a75b11a25101668a616e006b158251b16e/lib/searchkick/model.rb#L1-L25","documentation":"A deprecation notice printed via Searchkick.warn as `[searchkick] WARNING: ...` (searchkick.rb:280-282) when a model is declared with the legacy `searchkick conversions: ...` option (model.rb:8-9). Legacy conversions carry a query-to-count hash per document for personalized boosting; `conversions_v2` keeps that boost data in a dedicated subfield with much better search performance. It is not an exception - the option still works, and `conversions_v1` is the explicit alias that keeps the old behavior and silences the warning (model.rb:11-13).","triggerScenarios":"A model declared with `searchkick conversions: [:conversions]`, the pre-5.x style from older READMEs and tutorials. The warning fires at class load time - on Rails boot, eager loading, or the first search - after upgrading Searchkick to 5+.","commonSituations":"Upgrading Searchkick 4 to 5+ where `conversions` was the documented personalization API; copying conversion-boosting code from old blog posts; the warning appearing on every deploy/boot and polluting logs.","solutions":["Keep legacy behavior and silence the warning by renaming to `conversions_v1: [:conversions]`","Migrate to v2: add `conversions_v2: [:conversions]` fed from your conversion source (e.g. Searchjoy data), run both fields during zero-downtime (`searchkick conversions: [:conversions], conversions_v2: [:conversions_v2]`), reindex, then drop the old field","Remove the option entirely if you no longer use conversion boosting"],"exampleFix":"# before\nclass Product < ApplicationRecord\n  searchkick conversions: [:conversions]\n\n  def search_data\n    { name: name, conversions: conversion_counts }\n  end\nend\n\n# after (legacy behavior, warning silenced)\nclass Product < ApplicationRecord\n  searchkick conversions_v1: [:conversions]\n\n  def search_data\n    { name: name, conversions: conversion_counts }\n  end\nend","handlingStrategy":"validation","validationCode":"# config/initializers/searchkick_audit.rb - fail boot/CI on the legacy option\nDir[Rails.root.join(\"app/models/**/*.rb\")].each do |path|\n  if File.read(path) =~ /searchkick[^#]*[^_]\\w*conversions:/\n    raise \"Deprecated `conversions:` in #{path} - use conversions_v1 or migrate to conversions_v2\"\n  end\nend","typeGuard":null,"tryCatchPattern":null,"preventionTips":["After upgrading, grep app/models for options the CHANGELOG lists as deprecated","Route searchkick declarations through a shared concern so option migration is a one-line edit","Run a boot-time or CI check that fails on legacy option names"],"tags":["searchkick","deprecation","conversions","reindex","ruby"],"backgroundTag":"deprecation-warning","analyzedSha":"93e901a75b11a25101668a616e006b158251b16e","analyzedAt":"2026-08-21T19:06:23.767Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}