【发布时间】:2012-07-30 14:58:38
【问题描述】:
在我正在开发的 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')
问题是志愿者可能直到现在还没有任何参与,在这种情况下,查询完全忽略了这些志愿者。即使他们没有任何参与,我如何才能让所有志愿者返回?
【问题讨论】:
标签: sql ruby-on-rails-3 postgresql join scope