在我正在工作的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')
的问题是志愿者可能没有任何订婚到现在,并在这种情况下,查询完全不理会那些志愿者。即使他们没有任何交往,我如何能够让所有志愿者回归?
感谢您的回答。但是,抛出NoMethodError:未定义的方法'default_scoped?'为#。有任何想法吗?? –
2012-07-30 15:18:37
确定编辑我的答案。可能不是最好的语法,但它应该做的工作 – 2012-07-30 15:31:05
感谢您的帮助。不知何故,exists.not语法和NOT EXISTS不适合我。必须这样做才能使其工作:scope:not_engaged_between,lambda {| s,e |加入(“LEFT JOIN engagements e ON e.volunteer_id = volunteers.id AND e.date NOT BETWEEN'#{s}'AND'#{e}'”)。where([“e.volunteer_id IS NULL”])} ,它将按照@Erwin的建议生成SQL。再次感谢你的帮助! – 2012-07-30 16:18:55