Ruby on Rails中如何通过Ahoy的Event关联获取对应Visit记录?
获取与Ahoy事件关联的Visit记录
你遇到的问题很典型——Visit.joins(:@events)报错是因为joins方法需要接收关联名称(比如:ahoy_events)或者SQL片段,而@events是一个已经查询出来的事件集合,不是合法的关联参数。下面给你两种高效的解决方案:
方案一:从事件集合预加载关联访问记录(简单直接)
如果你的事件数量不算特别多,可以先预加载关联的visit记录,避免N+1查询问题,再提取去重:
# 先预加载关联的visit,减少数据库查询次数 @events = Ahoy::Event.where_properties(title: params[:token]).includes(:visit) # 提取所有关联的visit并去重(同一个visit可能对应多个符合条件的event) @visits = @events.map(&:visit).uniq
这里的includes(:visit)会一次性把所有关联的visit数据查出来,比循环每个event查visit要高效得多。
方案二:直接通过Visit表关联查询(大数量场景更高效)
如果符合条件的事件数量很多,直接从Visit表出发关联查询会更高效,只需要两次SQL查询:
# 先获取所有目标事件的ID @target_event_ids = Ahoy::Event.where_properties(title: params[:token]).pluck(:id) # 关联ahoy_events表,过滤出关联这些事件的visit,并用distinct去重 @visits = Visit.joins(:ahoy_events).where(ahoy_events: { id: @target_event_ids }).distinct
注意:如果你的Visit模型中对Ahoy事件的关联名称不是:ahoy_events(比如定义的是has_many :events, class_name: "Ahoy::Event"),记得把joins(:ahoy_events)改成对应的关联名,同时where里的表名也要调整成对应的(比如events: { id: @target_event_ids })。
两种方案都能解决你的问题,根据实际数据量选择就好~
内容的提问来源于stack exchange,提问作者a3y3
相关产品推荐
相关产品推荐

