1

大規模な SQL 結合を引き出すのではなく、Rails の関係を使用して物事を行うことに頭を悩ませようとしてきましたが、これについて頭を悩ませることはできません...

私は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
4

2 に答える 2

1

どうでも!答えは私の目の前にありました、私はちょうど適切な関連付けを取得しませんでした。

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

これは使用後に完全に機能します

:has_many, :through => :model

正しく機能させるには、もっと複雑な関係を設定する必要があることに気づいていませんでした...

于 2009-09-02T10:14:38.813 に答える
1

これは、Hotel で 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

これで、最低価格を表示している特定の都市のすべてのホテルをループできます。

@city.hotels.each do |hotel|
  puts "#{hotel.name}: #{hotel.cheapest_available}"
end
于 2009-09-02T10:22:23.853 に答える