我想做这样的事情,但它不起作用。
@events = Event.where(date:'10/10/2014')
@venues = Venue.joins(@events)
我知道正确的语法是Venue.joins(:events)
但是这会将所有事件与venue_id连接起来,这就是每一个事件。我希望获得与特定事件子集相关的所有场地。
答案 0 :(得分:2)
根据您的问题,我假设每个Event
都有Venue
。要查找一组事件的所有场所,请使用:
@events = Event.where(date: '10/10/2014')
@venues = Venue.where('id IN(?)', @events.map(&:venue_id))
map
方法将事件集合转换为venue_id
个数组。
如果您想避免在数据库外提取场地ID而导致性能下降,则此代码可能会更有帮助:
@venues = Venue.where('id IN(SELECT events.venue_id FROM events WHERE date = ?)', '10/10/2014')
答案 1 :(得分:1)
这是我刚刚找到的Arvoreniad答案的补充。另一个可以工作,但与这个纯粹的活跃记录解决方案相比似乎有点hacky:
Venue.joins(:events).where(events: {id: @events})
答案 2 :(得分:0)
实例化一系列事件只是为了获得场地是非常低效的。我会这样做:
@venues = Venue.joins(:events).where(events: {date: '10/10/2014'})