行動すれば次の現実

テック中心の個人ブログ

RailsでPostgreSQLの配列型の項目に対して検索をする

PostgreSQLの配列型に対して「〜を含む」という検索したかったので調べました。

配列型はアンチパターンなのですが、そこは目を瞑ってください。。

環境

  • ruby 2.7.4
  • rails 5.2.5
  • PostgreSQL 13.4

Migration

ブログ(Blogs)に複数のタグ(tags)を付与できるテーブルを作成します

class CreateBlogs < ActiveRecord::Migration[5.2]
  def change
    create_table :blogs do |t|
      t.references :user, foreign_key: true
      t.string :title, null: false
      t.text :detail, null: false
      t.text :tags, array: true

      t.timestamps
    end
  end
end

実装

railsというタグを保持しているブログを検索する場合

  • SQLで書くと
select * from blogs where 'rails' = ANY(tags)
  • Railsで書くと
Blog.where("'rails' = ANY(tags)")