私が取り組んでいるRailsアプリケーションでは、次の設定があります。
class Volunteer < AR::Base
has_many :engagements
end
class Engagement < AR::Base
belongs_to :volunteer
end
特定の日付または日付範囲に従事していないすべてのボランティアを選択しようとしています。
scope :not_engaged_on, lambda { |q| joins(:engagements).where(["engagements.date != ?", q])}
scope :not_engaged_between, lambda { |s, e| joins(:engagements).where(["engagements.date NOT BETWEEN ? AND ?", s, e]) }
ボランティアをフィルタリングするために、これらのスコープを他のスコープとマージしています。
上記のスコープ:not_engaged_between
は、次の SQL を生成します。
SELECT "volunteers".* FROM "volunteers" INNER JOIN "accounts" ON "accounts"."user_id" = "volunteers"."id" AND "accounts"."user_type" = 'Volunteer' INNER JOIN "engagements" ON "engagements"."volunteer_id" = "volunteers"."id" WHERE (accounts.activation_state = 'active') AND (engagements.date NOT BETWEEN '2012-07-30' AND '2012-08-04')
問題は、ボランティアが今まで何の関与もしていない可能性があり、その場合、クエリはそれらのボランティアを完全に無視することです。エンゲージメントがない場合でも、すべてのボランティアを返すにはどうすればよいですか?