1

我有以下模型关联:

音乐会has_one location。_ 位置是一个多态关联(音乐会不是唯一的可定位对象)。该位置由geocoder gem通过其地址属性进行地理编码。

目标是在未来某个城市附近找到一场音乐会。虽然地理编码器 gem 提供了.near(address_string)通过地址查找记录的方法,但我只能将该方法应用于位置类,而不是音乐会类。

我想出了以下解决方法:

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

问题是这会返回一系列音乐会,但我更喜欢一个关系,这样我就可以使用我的upcoming音乐会范围来仅查找未来发生的音乐会。

关于如何做到这一点的任何想法?

4

1 回答 1

1

你可以ActiveRecord::Relation这样做:

locatable_ids = Location.near('Berlin').where(locatable_type: 'Concert').map(&:locatable_id)
@concerts = Concert.where(id: locatable_ids).upcoming
于 2013-10-15T10:44:27.523 回答