使用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
相关产品推荐
相关产品推荐

