使用Ransack查询父模型的最后一条子记录字段
问题:查询父模型关联的最后一条子记录指定字段
我有一个包含多条子记录的父模型,想要筛选出最后一条(ID最大的)子记录的指定字段符合条件的父模型记录。
尝试Ransack _last关联语法失败
曾听说Ransack有_last关联语法,刚好匹配我的需求,但实际使用后发现不生效,而且官方文档里也找不到相关说明。示例代码如下:
Parent.ransack(children_last_name_eq: "search term").result
这段代码本应返回「最后一条子记录的name字段等于指定值」的父模型记录,但没有达到预期效果。
创建带作用域的has_one关联仍有问题
为解决这个问题,我在父模型中定义了带排序作用域的has_one关联:
class Parent has_many :children has_one :last_child, -> { order(id: :desc) }, class_name: "Child" end
现在调用parent.last_child可以正确返回该父模型的最后一条子记录,但用这个关联编写Ransack查询时:
Parent.ransack(last_child_name_eq: "search term").result
查询虽然能运行,但生成的SQL会丢失last_child关联中的排序作用域,转而匹配所有子记录。推测Ransack构建SQL时对has_one关联的解析逻辑和Active Record不一致。
补充说明
实际的Ransack查询逻辑比示例复杂得多,不能采用会破坏其他查询参数的方案。
使用环境:Ransack 2.3.2、Rails 5.2、MySQL 5.7
内容的提问来源于stack exchange,提问作者ikinner
相关产品推荐
相关产品推荐

