在我正在工作的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