You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Friendly_id时Track关联Poi列表出现类型转换错误求助

解决FriendlyId下Track slug导致的PG查询错误问题

这个问题我之前也碰到过,核心原因很简单:你用params[:track_id]拿到的是Track的slug字符串,但数据库里pois.track_id是整数类型,直接用字符串去匹配整数,PostgreSQL就会抛出PG::InvalidTextRepresentation错误。下面给你两个优雅的解决思路:

方案一:利用Rails关联查询(推荐)

既然Poi和Track是关联关系,完全可以先通过slug找到对应的Track,再直接获取它的Poi列表,这样既符合RESTful规范,又避免手动写where条件:

def index
  # 用friendly.find自动识别slug或id,找到对应的Track
  @track = Track.friendly.find(params[:track_id])
  # 直接通过关联获取该Track下的所有Poi
  @pois = @track.pois
end

friendly.find是FriendlyId提供的方法,它会先尝试用传入的参数查找slug匹配的记录,如果找不到再尝试匹配id,非常灵活。

方案二:手动转换为Track的id再查询

如果你坚持要保留原有的where查询逻辑,可以先通过slug找到Track的id,再用id去过滤Poi:

def index
  track = Track.friendly.find(params[:track_id])
  @pois = Poi.where(track_id: track.id)
end

这个方案和方案一本质类似,但不如关联查询简洁,所以更推荐方案一。

另外,你的路由配置没问题,shallow: true的嵌套路由会自动把Track的slug作为params[:track_id]传递过来,只要在控制器里正确处理这个参数就行。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:31:07