2011-02-13 2 views
1

에 제로 발행 수있는 모든 개체를 가져옵니다. 한 대의 자전거는 많은 대여를 할 수 있지만 최대 하나의 "능동적 인"대여가 가능합니다.루비 : 나는 각각 자전거에 자전거와 대여를 나타내는 두 개의 모델을 가지고 레일 2.3.8</p> <p>을 사용하고 특정 협회 및 조건

내가 사용자에게없는 모든 자전거의 목록을 제시 할 새로운 임대를 만들려면 : 나는 (BIKE_RENTAL_RETURNEDBIKE_RENTAL_INCIDENT 다른 두 가지 값) 값 BIKE_RENTAL_OUT으로 bike_rentals 테이블의 상태 필드와 활성 임대 구분 현재 임대 중입니다. 즉 "활성"대여가없는 모든 자전거입니다 (특정 조건과의 연관성이없는 경우).

class Bike < ActiveRecord::Base 
    has_many :bike_rentals 
    named_scope :not_rented, 
       :conditions => "bikes.id NOT IN " + 
        "(SELECT bike_id FROM bike_rentals " + 
        "WHERE bike_rentals.status = 'BIKE_RENTAL_OUT')" 

end 

class BikeRental < ActiveRecord::Base 
    belongs_to :bike 
end 

컨트롤러에서 나는 등 그 목록 수 : 아래 그림과 같이

나는 명명 된 범위를 사용하여 솔루션을 함께했다

@bikes = Bike.not_rented.find(:all, :order => 'chasis_number') 

작품 위의 코드를,하지만 난 있어요 이 문제에 대한 해결책이나 더 나은 "레일스"솔루션이되어야한다고 생각합니다.

나는 자전거가 가지고있는 "활성"대여의 수에 대해 카운터 캐시를 사용할 수 있음을 알고 있지만, 최대 1 개를 반환하는 모든 "비활성"대여를 선택하는 것은 너무 복잡한 해결책으로 보입니다. 자전거.

아이디어가 있으십니까?

답변

0

정확하게 이해하면 자전거에서 'BIKE_RENTAL_OUT'상태가없는 모든 자전거를 반환하고 싶습니다. has_may 관련 테이블 bike_rentals. 이것은 다음과 같이 범위가 될 수있을 것입니다 :

named_scope :not_rented, :joins => :bike_rentals, :conditions => [ "bike_rentals.status != ?", BIKE_RENTAL_OUT] 

희망이 자전거가 동시에 BIKE_RENTAL_OUT와 BIKE_RENTAL_RETURNED와 결합 될 수 있기 때문에

+0

불행하게도이 충분하지 않습니다 수 있습니다, 그래서 그것은 여전히 ​​것 named_scope에서 반환 한 목록에 나타납니다. BIKE_RENTAL_OUT이있는 행이없는 자전거는 같은 자전거가 참여할 때마다 필요합니다. – Miquel

+0

나는 당신의 말을 100 % 확신하지는 못하지만 각 자전거에 대한 가장 최근의 임대 상태를 평가하기를 원한다면 범위에서 하위 선택을 사용해야 할 것입니다. 여기에 이것을 보여주는 질문에 대한 링크가 있습니다. http://stackoverflow.com/questions/4858646/named-scope-to-only-search-first-results-of-joined-table –