2012-01-17 42 views
3

我試圖找到一種方法來創建一個簡單的外部連接,沒有太多的麻煩。我知道我可以通過指定一個外部連接手動執行此操作,但我正在尋找一種簡單的方法。Squeel在Rails上執行外部連接

因此,我正在看看Squeel,它似乎是Metawhere的新選擇。它似乎能夠處理外部連接,但我無法得到我想要的。

我特別有三種模式:

City 
Building 
CityBuilding 

我只是想,他們無論是在城市還是不存在的所有建築物的列表。 CityBuilding當然是連接城市和建築物的典範。我想獲得這樣的:

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

查詢爲空,因爲沒有city_building進入這一個,你的想法。

Squeel有沒有這樣做的方法?或者也許是另一個寶石,而不必手動做一個外部連接?

+0

「所有,他們無論是在城市或不存在的建築」 ......是不是'Building.find(:所有) '? – rkb 2012-01-26 01:24:10

+0

請重讀這個問題,這不是我所要求的。 – Spyros 2012-01-26 01:27:30

回答

5

我想你可以嘗試類似下面使用Squeel的東西。我不確定在哪裏。您將不得不提供兩個連接條件之一。

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預先加載包含執行OUTER JOIN後的關聯),這不是一個好的解決方案。