3

あまり面倒なことなく、シンプルな外部結合を作成する方法を見つけようとしています。外部結合を指定することでこれを手動で実行できることはわかっていますが、簡単な方法を探しています。

そのため、Metawhereの新しい代替手段と思われるSqueelを調べていました。外部結合は処理できるようですが、必要なものが得られません。

特に、私は3つのモデルを持っています:

City
Building
CityBuilding

都市に存在するかどうかに関係なく、すべての建物のリストが欲しいのですが。もちろん、CityBuildingは都市と建物をつなぐモデルです。私は次のようなものを手に入れたいです:

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

city_buildingこのクエリにはエントリがないため、クエリはnullになります。

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

4

2 に答える 2

5

Squeelを使って以下のようなことを試すことができると思います。whereの部分がよくわかりません。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}
于 2012-02-01T15:02:28.470 に答える
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")

ノート

クエリ(存在する場合)の後にcityオブジェクトにアクセスすることを想定しています。

これは、建物に関連付けられた都市オブジェクトを熱心にロードしたくない場合は適切なソリューションではありません(ARの熱心なロードには、OUTER JOINの実行後の関連付けが含まれるため)。

于 2012-01-28T04:48:53.997 に答える