2011-02-13 42 views
1

零個OCCURENCES所有實體,我使用Rails 2.3.8Ruby on Rails的:獲取對一個特定關聯和條件

我有兩個型號,它們分別代表了自行車和自行車出租。一輛自行車可以有很多租賃,但最多隻有一次「活躍」租賃。我區分了狀態字段中bike_rentals表中的有效租值爲BIKE_RENTAL_OUT(與其他兩個可能的值:BIKE_RENTAL_RETURNEDBIKE_RENTAL_INCIDENT

要創建一個新的租金,我要提供給用戶的是不是所有的自行車上的列表目前租用的,那就是所有沒有「活躍」租賃的自行車(與特定條件有關的零次出現)。

我使用了一個名爲範圍的解決方案提出瞭如下圖所示:

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

如果我理解正確,您希望返回自行車has_may關聯表bike_rentals中沒有'BIKE_RENTAL_OUT'狀態的所有自行車。這應該是能夠作用域是這樣的:

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

希望這有助於

+0

不幸的是,這是不夠的,因爲自行車可以在同一時間BIKE_RENTAL_OUT與BIKE_RENTAL_RETURNED即加盟,所以它會仍然出現在您的named_scope返回的列表中。我需要與BIKE_RENTAL_OUT沒有任何聯繫的自行車,無論同一輛自行車在聯接中有沒有其他條目。 – Miquel 2011-02-15 09:24:11