나는이복잡한라는 이름의 범위를 만들 협회 및 기타라는 이름의 범위 [레일]와 함께 좋은 게임 방법
class RentableItem < ActiveRecord::Base
named_scope :available_at, lambda{ |starts_at, ends_at| {
:select => "t.*",
:from => "(SELECT ri.*, COALESCE(c1.start_date, '#{starts_at}') AS EarliestAvailable,
COALESCE(c2.end_date, '#{ends_at}') AS LatestAvailable
FROM rentable_items ri
LEFT OUTER JOIN contracts c1 ON (ri.id = c1.rentable_item_id AND c1.start_date BETWEEN '#{starts_at}' AND '#{ends_at}')
LEFT OUTER JOIN contracts c2 ON (ri.id = c2.rentable_item_id AND c2.end_date BETWEEN '#{starts_at}'
AND '#{ends_at}' AND c2.start_date >= c1.end_date))
AS t",
:joins =>"LEFT OUTER JOIN contracts x ON (t.id = x.rentable_item_id AND x.start_date < t.LatestAvailable
AND x.end_date > t.EarliestAvailable)",
:conditions => "x.id IS NULL AND DATEDIFF(t.LatestAvailable, t.EarliestAvailable) >= #{(starts_at.to_date..ends_at.to_date).to_a.size - 1}"
}}
end
이 named_scope의 단일 통화가 마법처럼 작동하지만에 다음과 같은 명명 된 범위 난 '때 여러 개의 명명 된 범위를 함께 연결하려고하거나이 명명 된 범위에 연결 범위를 통해 액세스하려고합니다. 제 생각에는 select 문과 custom 절이 문제입니다. 어쩌면 누군가가이 named_scope를 다시 작성하여 체인 연결 및 스코어링 트로프 연결을 허용하는 방법을 알고 있을지도 모릅니다.
편집 :
감사는 alomst 노력하고 있습니다 Shtééf합니다.
named_scope :available_at, lambda{ |starts_at, ends_at| {
:select => "rentable_items.*",
:from => "(SELECT ri.*, COALESCE(c1.start_date, '#{starts_at}') AS EarliestAvailable,
COALESCE(c2.end_date, '#{ends_at}') AS LatestAvailable
FROM rentable_items ri
LEFT OUTER JOIN contracts c1 ON (ri.id = c1.rentable_item_id AND c1.start_date BETWEEN '#{starts_at}' AND '#{ends_at}')
LEFT OUTER JOIN contracts c2 ON (ri.id = c2.rentable_item_id AND c2.end_date BETWEEN '#{starts_at}'
AND '#{ends_at}' AND c2.start_date >= c1.end_date))
AS rentable_items",
:joins =>"LEFT OUTER JOIN contracts x ON (rentable_items.id = x.rentable_item_id AND x.start_date < rentable_items.LatestAvailable
AND x.end_date > rentable_items.EarliestAvailable)",
:conditions => "x.id IS NULL AND DATEDIFF(rentable_items.LatestAvailable, rentable_items.EarliestAvailable) >= #{(starts_at.to_date..ends_at.to_date).to_a.size - 1}"
}}
이 체인에 지금 범위 및 연결을 통해 액세스를 나를 수 있습니다.
시작에서 (생성과 끝 레일 배의 경우 condtion와 어쩌면 단지 화장품, 약간의 문제가있다 :
WHERE (`rentable_items`.container_item_id = 1) AND (((size > 10) AND (x.id IS NULL AND DATEDIFF(rentable_items.LatestAvailable, rentable_items.EarliestAvailable) >= 28)) AND (`rentable_items`.container_item_id = 1))
이중 WHERE 절을 만드는 원인이 무엇인지 모르겠지만 간단한 연관에서도이 점을 보았습니다. 그래서 걱정할 것이 없습니다. (하지만 다른 사람이 설명 할 수 있다면 여전히 좋을 것이다.) –