活动记录 - 对查询结果执行连接

时间:2014-10-02 23:42:28

标签: sql ruby-on-rails ruby rails-activerecord

我想做这样的事情,但它不起作用。

@events = Event.where(date:'10/10/2014')
@venues = Venue.joins(@events)

我知道正确的语法是Venue.joins(:events)但是这会将所有事件与venue_id连接起来,这就是每一个事件。我希望获得与特定事件子集相关的所有场地。

3 个答案:

答案 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'})