3

我正在尝试找到一种方法来创建一个简单的外部连接,而不会有太多麻烦。我知道我可以通过指定外部联接手动执行此操作,但我正在寻找一种简单的方法。

因此,我看了一下 Squeel,它似乎是 Metawhere 的新替代品。它似乎能够处理外部连接,但我无法得到我想要的。

特别是,我有三个模型:

City
Building
CityBuilding

我只想列出所有建筑物的清单,无论它们是否存在于城市中。CityBuilding 当然是将城市与建筑物连接起来的模型。我想得到类似的东西:

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

该查询为空,因为此查询没有city_building条目,您明白了。

Squeel 有没有办法做到这一点?或者可能是另一个宝石,而无需手动进行外部连接?

4

2 回答 2

5

我认为您可以使用 Squeel 尝试以下类似的操作。我不确定 where 部分。您必须提供两个加入条件之一。

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")

笔记

我假设您想在查询后访问城市对象(如果存在)。

如果您不想预先加载与建筑物关联的城市对象(因为 AR 预先加载包括执行 OUTER JOIN 后的关联),这不是一个好的解决方案。

于 2012-01-28T04:48:53.997 回答