我正在尝试找到一种方法来创建一个简单的外部连接,而不会有太多的麻烦。我知道我可以通过指定一个外部连接来手动完成此操作,但我正在寻找一种简单的方法。
因此,我看了一下Squeel,它似乎是Metawhere的新替代品。它似乎能够处理外连接,但我不能得到我想要的东西。
具体地说,我有三个模型:
City
Building
CityBuilding我只想要一份所有建筑物的列表,无论它们是否存在于城市中。当然,CityBuilding是连接城市和建筑物的模型。我想要得到这样的东西:
city 1{
TownCenter => city_building
Sawmill => city_building
Quarry => nil
} 这个查询是空的,因为这个查询没有city_building条目,您就明白了。
有没有办法让Squeel做到这一点?或者是另一个gem,而不需要手动执行外部连接?
发布于 2012-02-01 23:02:28
我认为你可以使用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}发布于 2012-01-28 12:48:54
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急切加载包括在执行外部联接之后的关联),则这不是一个好的解决方案。
https://stackoverflow.com/questions/8889280
复制相似问题