ruby-on-rails 使用Ransack搜索最后一个子记录

643ylb08  于 2023-03-31  发布在  Ruby
关注(0)|答案(1)|浏览(165)

我有一个有很多孩子的父母。我有兴趣搜索最后一个(最高ID)孩子记录上的一列。
我在Ransack中看到了一个“_last”关联语法的引用,这正是我想要做的。但是它不起作用,我在文档中找不到任何引用。它看起来像这样:

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

现在parent.last_child正确地返回了最后一个子对象。然后我使用以下命令创建了一个Ransack查询:

Parent.ransack(last_child_name_eq: "search term").result

这会运行,但是当我查看它生成的SQL时,它会将范围降低到最后一个子记录,并搜索所有子记录。我假设ransack构建SQL时,它解释has_one的方式与活动记录不同。
我实际的ransack查询比这个复杂得多,所以我不能实现任何会破坏其他搜索参数的东西。Ransack 2.3.2 on Rails 5.2 using MySQL 5.7

rslzwgfq

rslzwgfq1#

我使用模型中的默认作用域和自定义ransack行实现了这一点:

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

相关问题