質問するログイン新規登録

Q&A

0回答

811閲覧

マルチDBに対して ransack で検索する際、デプロイしたら ransack 使用時に 'No table named "sub.users" exists.' と出力される

apollon

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2022/03/03 06:11

編集2022/03/07 01:13

0

0

前提

現在、rails6のマルチDB機能によって2つのデータベースを連携してwebサービスの運用をしております。

以下データベース名を

  • main
  • sub

とします。

参考サイトにあるように、モデルに対してtable_name_prefixを使用することで複数DB間検索を実装しました。
https://github.com/activerecord-hackery/ransack/issues/463#issuecomment-61716552

複数DB間検索の例

mainにitemsというテーブル(main.items)、subにusersというテーブル(sub.users)が存在し、以下のようなモデルがあるとします。

ruby

1class Item < ApplicationRecord 2 belongs_to :user 3end 4 5class User < SubApplicationRecord 6 has_many :items 7end

このとき、ransackでitemに紐づくuserの名前を検索するようなことを指します。
ちなみにこのときのransackのparamsは以下のようになります

item_user_name_cont

発生している問題

ローカルでは複数DB間検索ができていましたが、ステージング環境にデプロイした際には検索時に以下のエラーが発生しました。

Api::V1::Mypage::TestController::get_error_log_str No table named sub.users exists. .../vendor/bundle/ruby/2.6.0/gems/ransack-2.4.2/lib/ransack/adapters/active_record/context.rb:19:in `type_for' .../vendor/bundle/ruby/2.6.0/gems/ransack-2.4.2/lib/ransack/nodes/attribute.rb:35:in `type' .../vendor/bundle/ruby/2.6.0/gems/ransack-2.4.2/lib/ransack/nodes/condition.rb:227:in `block in casted_values_for_attribute' .../vendor/bundle/ruby/2.6.0/gems/ransack-2.4.2/lib/ransack/nodes/condition.rb:227:in `map' .../vendor/bundle/ruby/2.6.0/gems/ransack-2.4.2/lib/ransack/nodes/condition.rb:227:in `casted_values_for_attribute' .../vendor/bundle/ruby/2.6.0/gems/ransack-2.4.2/lib/ransack/nodes/condition.rb:231:in `formatted_values_for_attribute' .../vendor/bundle/ruby/2.6.0/gems/ransack-2.4.2/lib/ransack/adapters/active_record/ransack/nodes/condition.rb:32:in `format_predicate' ...

しかし、sub.usersは存在します。
また、該当のエラーは以下の schema_cache.data_source_exists? が false になることで発生します。
https://github.com/activerecord-hackery/ransack/blob/master/lib/ransack/adapters/active_record/context.rb#L19

def type_for(attr) return nil unless attr && attr.valid? name = attr.arel_attribute.name.to_s table = attr.arel_attribute.relation.table_name schema_cache = self.klass.connection.schema_cache unless schema_cache.send(:data_source_exists?, table) raise "No table named #{table} exists." end attr.klass.columns.find { |column| column.name == name }.type end

ローカルにおいてこのエラーは発生しなかったので、railsの設定が間違っているかとも考えましたが、原因を掴めませんでした。

以下が、railsのステージング環境の設定ファイルです。

# environments/staging.rb Rails.application.configure do config.cache_classes = true config.eager_load = true # Full error reports are disabled and caching is turned on. config.consider_all_requests_local = false config.action_controller.perform_caching = true config.read_encrypted_secrets = true config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? config.log_level = :debug config.log_tags = [:request_id] config.action_mailer.perform_caching = false config.i18n.fallbacks = true config.active_support.deprecation = :notify config.log_formatter = ::Logger::Formatter.new if ENV["RAILS_LOG_TO_STDOUT"].present? logger = ActiveSupport::Logger.new(STDOUT) logger.formatter = config.log_formatter config.logger = ActiveSupport::TaggedLogging.new(logger) else config.logger = Logger.new('../log/staging.log', 'daily') end config.active_record.dump_schema_after_migration = false config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp config.action_mailer.default_url_options = { host: 'xxxxxx' } ActionMailer::Base.smtp_settings = { ... } config.active_storage.service = :xxxx Rails.application.routes.default_url_options[:host] = 'xxxx' end

期待する結果

ステージング環境でも複数DB間検索ができるようにする。

こちらrailsに詳しい方がおられましたら教えていただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問