2009-09-02 56 views
1

我一直在試圖讓我的頭繞着使用我的Rails關係做事,而不是拔出大的SQL連接,但我無法圍繞這一個包裹我的頭......多個模型之間的平均杆

我有3種型號

酒店 客房 可獲取

他們都有適當的has_many和belongs_to的關係。

我想要做的是在概述頁面上列出某個特定城市的酒店,我想列出爲每個酒店找到的最低價格。

在SQL

現在,我當然會做的底部代碼的位,但在鐵軌我可以做這樣的事情......

當然
def self.price 
    Available.minimum(:price, 
       :conditions => [ "price <> 0" ]) 
    end 

這只是翻出所有的最低價格他們,而不是特定的ID

問題是關係Hotel.find(1234).rooms.availables

但我想這樣做,可以去我的循環中,而不必引用ID?

SELECT MIN(availables.price) 

FROM availables 

INNER JOIN rooms ON rooms.id = availables.room_id 
INNER JOIN hotels ON hotels.id = rooms.hotel_id 

WHERE hotels.id = 5077 and rooms.private = 0 and availables.price <> 0 

回答

1

可以完成這通過設置一個has_many:通過酒店關係:

class Hotel < ActiveRecord::Base 
    has_many :rooms 
    has_many :availables, :through => :rooms 

    # If you want "rooms"."private" condition, use these... 
    has_many :public_rooms, :class_name => 'Room', :conditions => {:private => 0} 
    has_many :public_availables, :through => :public_rooms, :source => :availables 

    # This caches the value (potentially saving you db hits) for the 
    # lifetime of the object, which you may or may not want depending 
    # on your needs... 
    def cheapest_available 
    @cheapest_available ||= availables.minimum(:price, :conditions => ['availables.price > ?', 0]) 
    end 
end 

現在你可以通過al循環在特定城市中顯示最低價格的酒店:

@city.hotels.each do |hotel| 
    puts "#{hotel.name}: #{hotel.cheapest_available}" 
end 
1

沒關係!答案就在我面前,我只是沒有得到正確的聯繫。

def self.price 
    Available.minimum(:price, 
       :conditions => [ "price <> 0" ]) 
    end 

此使用

:has_many, :through => :model 

後完美的作品我沒有意識到我不得不設置,以便它能夠正常工作更爲複雜的關係......