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)