我的父母有很多孩子。我有兴趣在最后(最高ID)子记录上搜索列。
我看到一个引用"_last"Ransack中的关联语法,这正是我想做的。但它不起作用,我在文档中找不到任何参考。它看起来像这样:
Parent.ransack(children_last_name_eq: "search term").result
这应该搜索父节点的最后一个子节点的name列,并返回匹配的父节点记录。这将是理想的,但不工作。
因此,我创建了一个作用域为has_one的关联,如:class Parent
has_many :children
has_one :last_child, -> { order(id: :desc) }, class_name: "Child"
end
现在的父母。Last_child正确返回最后一个子对象。然后我用下面的语句创建了一个Ransack查询:
Parent.ransack(last_child_name_eq: "search term").result
运行,但是当我查看它生成的SQL时,它将作用域降低到最后一个子记录,并搜索所有子记录。我假设当ransack构建SQL时,它对has_one的解释与活动记录不同。
我的实际搜索查询比这复杂得多,所以我不能实现任何会破坏其他搜索参数的东西。在Rails 5.2上使用MySQL 5.7
我使用模型中的默认作用域和自定义洗劫行获得了此工作:
default_scope {
joins('JOIN children ON parent.id = children.parent_id and children.id = (SELECT MAX(children.id) FROM children WHERE children.parent_id = parent.id)')
}
ransacker :child_name, type: :string do
Arel.sql('children.name')
end