Child1 と Child2 には Entity との STI 関係があり、Child2 には Child1 が _many 含まれています。Child1 には、AASM によって管理されるステータス列があります。
class Entity < ActiveRecord::Base
end
class Child1 < Entity
include AASM
aasm_column 'status' do
state :owned #also creates scope Child1.owned
state :sold
end
belongs_to :child2
end
class Child2 < Entity
has_many :child1s
end
Child1 の各状態の Child2 にスコープを作成したいと思います。その状態にある 1 つ以上の Child1 レコードを持つすべての Child2 レコードを返す必要があります。理想的には、AASM が自動的に作成するスコープを再利用します。
scope :owned, -> {joins(:child1s).merge(Child1.owned)} #in Child2
...これは素晴らしく、きれいで、DRYです。残念ながら、これが生成する SQL は、同じテーブルの結合によって混乱します。
irb(main):001:0> Child2.owned
Child2 Load (35.5ms) SELECT "entities".* FROM "entities"
INNER JOIN "entities" "child1_entities" ON "child1_entities"."child2_id" = "entities"."id" AND "child1_entities"."type" IN ('Child1')
WHERE "entities"."type" IN ('Child2') AND "entities"."status" = 'owned'
where 句の最後の部分はchild1_entities.status = 'owned'
.
クエリ全体を SQL または Arel で記述できますが、child1 結合のエイリアスを指定するためにそこに移動する必要がある場合でも、Child1 に既にあるスコープを再利用できるものを見つけたいと考えています。