Ruby on rails 将数组映射到关系

Ruby on rails 将数组映射到关系,ruby-on-rails,activerecord,associations,geocoding,Ruby On Rails,Activerecord,Associations,Geocoding,我有以下模型关联: 一场音乐会有一个地点。位置是一个多态关联(音乐会不是唯一的位置表)。位置通过其地址属性由进行地理编码 目标是在未来某个城市附近找到一场音乐会。虽然geocoder gem提供了.near(address\u string)方法来按地址查找记录,但我只能将该方法应用于location类,而不能应用于concert类 我提出了以下解决方法: Location.near("Berlin").where(locatable_type: 'Concert').map(&:loc

我有以下模型关联:

一场音乐会有一个地点。位置是一个多态关联(音乐会不是唯一的位置表)。位置通过其地址属性由进行地理编码

目标是在未来某个城市附近找到一场音乐会。虽然geocoder gem提供了
.near(address\u string)
方法来按地址查找记录,但我只能将该方法应用于location类,而不能应用于concert类

我提出了以下解决方法:

Location.near("Berlin").where(locatable_type: 'Concert').map(&:locatable)
让我来详细分析一下:

Location.near("Berlin")
# ==> returns locations of any kind near Berlin

.where(locatable_type: 'Concert')
# ==> returns concert locations near Berlin

.map(&:locatable)
# ==> returns an array of concerts near Berlin
问题是,这会返回一个音乐会数组,但我更喜欢一个关系,这样我就可以使用我的
即将到来的
音乐会范围来查找将来发生的音乐会


有什么想法吗?

您可以让
ActiveRecord::Relation
这样做:

locatable_ids = Location.near('Berlin').where(locatable_type: 'Concert').map(&:locatable_id)
@concerts = Concert.where(id: locatable_ids).upcoming

您可以让
ActiveRecord::Relation
执行以下操作:

locatable_ids = Location.near('Berlin').where(locatable_type: 'Concert').map(&:locatable_id)
@concerts = Concert.where(id: locatable_ids).upcoming

@SergioTulentsev为什么不呢?如果我理解正确的话,OP想要一些不同的东西。一个查询,而不是两个。@SergioTulentsev对不起,我找不到有疑问的这个要求。你能给我看一下合适的碎片吗?马瑞克:我就是这么推断的。否则他为什么要建立关系?@SergioTulentsev“问题是,这会返回一系列音乐会,但我更希望建立一种关系,这样我就可以使用即将到来的音乐会范围,只查找未来发生的音乐会。”@SergioTulentsev为什么不这样做?如果我理解正确,OP希望有所不同。一个查询,而不是两个。@SergioTulentsev对不起,我找不到有疑问的这个要求。你能给我看一下合适的碎片吗?马瑞克:我就是这么推断的。否则他为什么要建立关系?@SergioTulentsev“问题是,这会返回一系列音乐会,但我更喜欢建立关系,这样我就可以使用即将到来的音乐会范围,只查找未来发生的音乐会。”