我一直在学习实现一个小型的 ROR 系统,并使用强大的 Datagrid gem 来过滤、排序、导出数据等。
今天,我一直在尝试基于子对象迭代过滤器。 让我们说: - 我有一个主要的客户端对象,我进行过滤 - 客户拥有并属于许多产品 - 产品拥有并属于许多客户 - 产品所属类别
就我而言: - A 类有 3 个产品 P1、P2、P3 - B类有2种产品P4、P5 - 客户有 5 个产品 P1、P2、P3、P4 和 P5
目前,我只能实现一个产品过滤器,我可以检索客户使用的所有产品。
买我想要的就是按类别拆分产品。因此,它应该有两个类别过滤器。问题是迭代不能在 Datagrid 类中使用。
我想知道是否有类似的方法:
Category.all.each do |category|
filter(:category_name, :enum, ...) do |scope|
...
end
end
您可以使用
dynamic
方法来实现,该方法允许在运行时动态生成列和过滤器:
class ClientGrid
include Datagrid
scope do
Client.all
end
dynamic do
Category.all.each do |category|
filter("#{category.name.underscore}_product_id", :enum,
select: -> { category.products.pluck(:name, :id) }) do |scope, id|
scope.joins(:products).where(products: { id: id, category_id: category.id })
end
end
end
end