1

Schools と EventLeg のレコードが、特定の Event に属する Photos によって結び付けられている状況があります。

class Photo < ActiveRecord::Base
  belongs_to :event
  belongs_to :event_leg
  has_and_belongs_to_many :schools
end
class Event < ActiveRecord::Base
  has_many :event_legs, :through => :photos, :group => 'event_legs.id'
  has_many :photos
end
class School < ActiveRecord::Base
  has_and_belongs_to_many :photos
  has_many :events, :through => :photos
  has_many :event_legs, :through => :photos
end
class EventLeg < ActiveRecord::Base
  has_many :photos
  has_many :schools, :through => :photos
end

イベントの特定のイベントレグに登場した学校を取得する必要があります。

@event = Event.find 4088
@event.schools.joins(:photos).where('photos.event_leg_id' => 28034)

photos_schoolsこれにより、テーブルを 2 回 (1 回は に、もう 1 回は に)schools結合する SQL が生成されますphotos

SELECT DISTINCT `schools`.* FROM `schools` 
INNER JOIN `photos_schools` `photos_schools_join` ON `photos_schools_join`.`school_id` = `schools`.`id` 
INNER JOIN `photos` `photos_schools_2` ON `photos_schools_2`.`id` = `photos_schools_join`.`photo_id` 
INNER JOIN `photos_schools` ON `schools`.`id` = `photos_schools`.`school_id` 
INNER JOIN `photos` ON `photos_schools`.`photo_id` = `photos`.`id` 
WHERE `photos`.`event_id` = 4088 AND `photos`.`event_leg_id` = 28034

photos_schools -> photos の 2 番目の JOIN は不要です。次のクエリは同じことをより高速に実行します。

SELECT DISTINCT `schools`.* FROM `schools` 
INNER JOIN `photos_schools` ON `schools`.`id` = `photos_schools`.`school_id` 
INNER JOIN `photos` ON `photos_schools`.`photo_id` = `photos`.`id` 
WHERE `photos`.`event_id` = 4088 AND photos.event_leg_id = 28034;

では、AR がこの 2 番目の結合セットを作成するのはなぜですか? どうすればそれを停止できますか?

4

1 に答える 1

1

joins(:photos) をスキップしてみてください。うまくいくはずです

     @event.schools.where('photos.event_leg_id' => 28034)
于 2012-10-27T10:07:21.713 に答える