Techioz Blog

Rails 7 の多対多の関係、複数の関連アイテムを持つアイテムの検索

概要

Rails 7 に 3 つのモデル、いくつかの項目、識別子、および結合モデルがあると仮定します。

class Item < ApplicationRecord
  has_many :item_identifiers
  has_many :identifiers, through: :item_identifiers
end

class ItemIdentifier < ApplicationRecord
  belongs_to :item
  belongs_to :identifier
end

class Identifier < ApplicationRecord
  has_many :item_identifiers
  has_many :items, through: :item_identifiers
end

これにより、アイテムから識別子にアクセスできます

item.identifiers

識別子を持つアイテムをデータベースで検索できます

Item.joins(:identifiers).where("`identifiers`.`desc` LIKE %foo%")

アイテムがあり、それに 2 つの識別子があると仮定します。 フーバー 次の検索があります

search1 = ["oo"]
search2 = ["foo", "ar"]
search3 = ["fo", "baz"]

複数の識別子を持つアイテムを検索するにはどうすればよいですか。 上記の検索配列に基づいて、search1 と search2 の両方で項目が見つかるはずですが、search3 では見つからないはずです。

解決策

ここでさらに検索した結果、答えが見つかりました

解決策は、項目モデルに以下を追加することです

    def self.with_identifiers(identifiers)
        sql = identifiers.
          map { |identifier| Item.joins(identifiers).where("identifiers.desc LIKE ?", "%#{identifier}%") }.
          map { |relation| "(#{relation.to_sql})" }.
          join(" INTERSECT ")
      
        find_by_sql(sql)
      end

次を使用して検索します

Item.with_identifiers(search1)