2009-09-02 19 views
1

大規模なSQL結合を引き出すのではなく、Railsの関係を使用して頭を上げようとしていましたが、私はこれを回避することができません...複数のモデル間の平均レール

は私が3つのモデル

ホテル 部屋 Availables

彼らはすべて適切にhas_manyとbelongs_toの関係を持っています。

私がやりたいことは、特定の都市のホテル一覧の概要ページにある、私は各ホテルで見つかった最低価格を列挙したいと思います。当然の

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

これはただのすべての最低価格を引っ張る私はもちろんの下部にあるコードのビットを行うだろうが、レールに、私はこのような何かを行うことができ、SQLで今

...彼らではなく、特定の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:through関係を設定することによって実現します。

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 

最低価格を表示する特定の都市のホテルのうち、l:

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

Nevermind!答えは私の目の前であった、私はちょうど適切な関係を得ていなかった。あなたが達成することができます

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

これは完全に

:has_many, :through => :model 

を使用した後、私はちょうど私がセットアップにそれを正しく動作させるためには、より複雑な関係を持っていた気づいていなかった作品...