はじめに
ポリモーフィック関連先の項目の検索方法を時間をかけて調べたのですが、なかなか出てこなかったためまとめておこうかなと思います。
ポリモーフィック関連の作成方法などはやりません。
関連リンクを下記に載せておくので、必要であれば参考にしてください。。
- Railsガイド - ポリモーフィック関連付け
関連性
以下のようなAnimal
モデル、Panda
モデル、Cat
モデルの構成を作成します。
animal.rb
class Animal < ApplicationRecord
belongs_to :animalable, polymorphic: true
end
panda.rb
class Panda < ApplicationRecord
has_many :animal, as: :animalable, dependent: :destroy
end
cat.rb
class Cat < ApplicationRecord
has_many :animal, as: :animalable, dependent: :destroy
end
ポリモーフィック関連先の項目の検索方法
手順としては、以下となります。
-
Animal
モデルにPanda
モデルをJOIN
-
where
句で検索を実行
まずは、Panda
モデルの例を見ていきます。
# join SQL
join_sql = <<-"EOS"
JOIN pandas
ON pandas.id = animals.animalable_id
AND animals.animalable_type = 'Panda'
EOS
animals = Animal.joins(join_sql)
# search SQL
animals.where("pandas.name LIKE '%ran%'")
次にCat
モデルです。まぁ同じですが。。
# join SQL
join_sql = <<-"EOS"
JOIN cats
ON cats.id = animals.animalable_id
AND animals.animalable_type = 'Cat'
EOS
animals = Animal.joins(join_sql)
# search SQL
animals.where("cats.name LIKE '%dora%'")
まとめ
ActiveRecord を使っていろいろと試してみたのですが、期待する動作をしてくれませんでした。
力技であまり良くないんだろうなぁと思いましたが、SQLを直接書きました。
もっといいやり方をご存知の方がいれば、教えていただきたいです。
参考
- Rails4: ActiveRecord polymorphicのjoins検索?