2012-01-17 10 views
3

あまりにも面倒なく単純な外部結合を作成する方法を見つけようとしています。私は外部結合を指定することでこれを手動で行うことができますが、私は簡単な方法を探しています。Railsで外部結合を実行するように頼む

したがって、私はSqueelを見ていました.Squeelは、Metawhereの新しい選択肢のようです。それは外部の結合を扱うことができるようですが、私は私が望むものを得ることができません。特に

、私は三つのモデルがあります:

City 
Building 
CityBuilding 

を私は単に彼らは都市でか存在するかどうか、全ての建物のリストをしたいと思います。 CityBuildingはもちろん、都市と建物を結ぶモデルです。クエリは、この1にはcity_buildingエントリが存在しないので、あなたのアイデアを得るnullである

city 1{ 
    TownCenter => city_building 
    Sawmill => city_building 
    Quarry => nil 
} 

:私のような何かを取得したいと思います。

Squeelがそれを行う方法はありますか?または、手動で外部結合を行うことなく、別の宝石ですか?

+0

... 'Building.findということではありません "彼らは都市でか存在するかどうか、全ての建物"(:すべて) '? – rkb

+0

質問を読んでください、これは私が求めているものではありません。 – Spyros

答えて

5

私はあなたがSqueelを使って以下のようなものを試すことができると思います。私はその部分については分かりません。 2つの結合条件のいずれかを指定する必要があります。

Building.joins{city}.joins(city_buildings.outer).where{(buidlings.id == city_buildings.building_id) & (cities.id == city_buildings.city_id)} 

または

Building.joins{city}.joins(city_buildings.outer).where{buidlings.id == city_buildings.building_id} 

または

Building.joins{city}.joins(city_buildings.outer).where{cities.id == city_buildings.city_id} 
2

ARアソシエーションincludesは、LEFT OUTER JOINを使用します。それから、次のようにモデルの関係を持っている場合:

class City 
    has_many :city_buildings 
    has_many :buildings, :through => :city_buildings 
end 

class Building 
    has_one :city_building 
    has_one :city, :through => :city_building 
end 

class CityBuilding 
    belongs_to :city 
    belongs_to :building 
end 

Building.includes(:city).where(...) 

市内リンクのと建物のリストを取得するにかかわらず、市のリンクの建物のリストを取得するには

Building.includes(:city).where("cities.id IS NOT NULL") 
私が想定しています

クエリの後に市オブジェクトにアクセスしたい場合は(存在する場合)

建物に関連付けられた都市オブジェクトを熱心にロードしたくない場合(AR eager loadにOUTER JOINを実行した後の関連付けが含まれているため)、これは良い解決策ではありません。

関連する問題