1

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 に既にあるスコープを再利用できるものを見つけたいと考えています。

4

1 に答える 1