私はこれらのモデルを持っています:
SpaceShip < ActiveRecord::Base
has_one :martian
has_many :people
Person < ActiveRecord::Base
has_many :skills
Martian < ActiveRecord::Base
belongs_to :skill
Skill < ActiveRecord::Base
#rest omitted
martian.skill.name = 'drive' または person.skill.name = 'drive' の宇宙船を見つけるスコープが必要です
最初は簡単に思えますが、そうではありません。
Spaceship < ActiveRecord::Base
scope :by_skill_name, -> (skill_name){
joins([[people: :skills], [martian: :skill]])
.where('skills.name=?', skill_name)
}
関連付けのみをカウントするため、このスコープは機能しませんmartian.skill
。
SQLで結合部分を作成し、テーブルエイリアスを使用してみました。動作しますが、他のスコープとチェーンすると SQL エラーが発生します。
私も試してみましjoins(...).merge(joins(...))
たが、まだ最後の関係しか得られません。
Active Record には 'union' ステートメントがありません。実装する方法をいくつか見てきましたが、複雑すぎてハックになるかどうかはわかりません。
何か案が?
ありがとう。
編集:
今ではsqueel where{(martian.skill.eq skill_name)|(people.skills.eq skill_name)}
を使用して解決しましたが、プレーンな AR で可能かどうかを知りたいです。