LoginSignup
0
0

More than 1 year has passed since last update.

Railsで全てのレコードを検索する

Last updated at Posted at 2022-01-23

全てのテーブルの全てのレコードの中から特定の単語を検索する方法

以下のコードをコピーして、検索したい文字列を入力して、コンソールで実行するだけで検索できます。

search_word.rb
ActiveRecord::Base.connection.tables.each do |table|
  model_name = "#{table.camelize.chop}".constantize rescue next
  model_name.column_names.each do |column_name|
    if model_name.columns_hash["#{column_name}"].type.to_s == ("string" || "text")
      pp table_model.where("#{column_name} like ?", '%ここに検索したい文字を入力%') rescue next
    end
  end
end

よくわかる解説

大まかな方針としては、(モデル名).where("カラム名 like ?", "検索したい文字列")を全てのモデルに対して実行します。

そのためには、全てのモデル名と全てのカラム名を取得する必要があります。

  1. ActiveRecord::Base.connection.tablesで全てのテーブルの名前を抽出できます。ただし、この時点だとテーブル名がtable_namesのように複数形のスネークケースになっているのでモデル名にはなりません。

  2. そこで、table.camelize.chopで取得したテーブル名をキャメルケースに変換していきます。(テーブル名).camelizeでテーブル名が複数形のキャメルケースになります(例:TableNames)。また、chopで単語の末尾の一字を削除できるのでTableNamesTableNameのように変換されます。

  3. 取得したモデル名はただのStringで、クラスではありません。そこで、constantizeメソッドで文字列をクラスにしていきます。

  4. モデル名は取得できました。次はモデルにある全てのカラムを抽出していきます。カラムは(モデル名).column_namesで取得可能です。

  5. テーブル名とカラム名は取得できたので、(モデル名).where("カラム名 like ?", "検索したい文字列")を実行すれば検索したい文字列は取得できます。ただし、booleanやintegerなどは検索対象外です。データ型がstringとtextの場合のみ検索を行います。モデルからカラム名を取得する方法は(モデル名).columns_hash["カラム名"].typeで取得できます。

  6. 最後は定番のwhere~like?で検索すれば完了です!consoleで実行することが多いかと思います。ぜひご活用ください!

参考文献一覧

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0