Posted at

Rails4で中間テーブルがポリモーフィックなテーブルとhas_many throughする

More than 3 years have passed since last update.


問題

中間テーブルを簡単につなぐことができるhas_many throughは便利だけど、中間テーブルがポリモーフィックな場合はどう書けばいいの?


こう書けば良い

以下の図のように、StudyPaticipantが中間テーブルかつポリモーフィックなモデルだとします。

  User - has_many -> StudyParticipant - has_many -> Subsciption

- has_many -> Adoption

で、こんな感じにSubscriptionやAdoptionを引っ張りたい。

user.subscriptions

user.adoptions

そんなときはこんな感じに定義すれば良いようです。

# user.rb

class User < ActiveRecord::Base
has_many :study_participants
has_many :subscriptions, through: :study_participants, source: :study, source_type: 'Subscription'
has_many :adoptions, through: :study_participants, source: :study, source_type: 'Adoption'
end

# study_participant.rb
class StudyParticipant < ActiveRecord::Base
belongs_to :study, polymorphic: true
end

# subscription.rb
class Subscription < ActiveRecord::Base
has_many :study_participants, as: :study
end

# adoption.rb
class Adoption < ActiveRecord::Base
has_many :study_participants, as: :study
end

Rails3のときはhas_manyのconditionsキーでベタに書いていた気がするのですが、Rails4からはsource_typeというキーが用意されていました。