繁体   English   中英

传递给 ransacker 的活动管理员过滤器参数

[英]Active Admin filter params passed to ransacker

我正在尝试将几个 ID 传递给活动管理员的自定义 ransacker 过滤器

   filter :hasnt_purchased_product_items_in, as: :select, collection: -> { ProductItem.all }, multiple: true

掠夺者代码

ransacker :hasnt_purchased_product_items, formatter: proc { |product_id|
    users_who_purchased_ids = User.joins(:orders => :items).where("orders.status = 'success'").where("order_items.orderable_id IN (?)", product_id) # return only id-s of returned items.
    ids = User.where.not(id: users_who_purchased_ids).pluck(:id)
    ids.present? ? ids : nil # return ids OR nil!
} do |parent| # not sure why this is needed .. but it is :)
    parent.table[:id]
end 

这适用于单个查询但不适用于多个查询,SQL 正在执行 2 个单独的搜索而不是一个

它正在运行以下 2 个语句

order.items.orderable_id IN ('90')

order.items.orderable_id IN ('91')

在 2 个单独的 SQL 语句中,而不是我想要的是

order.items.orderable_id IN ('90','91')

从活动管理页面提交的信息是

q[hasnt_purchased_product_items_in][]: 90
q[hasnt_purchased_product_items_in][]: 91

我想我需要在 ransacker 阶段对传入参数做一些事情,但我不确定如何处理

它不应该介入。参数应该是 |product_ids| 并在 proc 中给我们一个数组 object 然后使用。 你的掠夺者应该返回一个活动记录关联或一个 arel 查询。

我会尝试每一个:

  1. 在 ransacker 名称中使用“_in”,绕过数组逻辑。
ransacker :hasnt_purchased_product_items_in do |product_ids|
  users_who_purchased_ids = User.joins(orders: :items).where(orders: {status: 'success'}, order_items: {orderable_id: product_ids}) # return only id-s of returned items.
  User.where.not(id: users_who_purchased_ids)
end
  1. 相同的掠夺者名称,但使用块而不是格式化程序。
ransacker :hasnt_purchased_product_items do |product_ids|
  users_who_purchased_ids = User.joins(orders: :items).where(orders: {status: 'success'}, order_items: {orderable_id: product_ids}) # return only id-s of returned items.
  User.where.not(id: users_who_purchased_ids)
end 

我不得不猜测 object 返回,因为不清楚这个劫掠者在哪个 model 上。 如果您能告诉我目标(例如过滤用户的产品推荐以排除他们的购买),那么我可以更新答案。

  1. 创建一个 scope 并使其可供搜查。

用户.rb

  scope :hasnt_purchased_product_items_in, ->(product_ids){
   users_who_purchased_ids = joins(orders: :items).where(orders: {status: 'success'}, order_items: {orderable_id: product_ids}) # return only id-s of returned items.
   where.not(id: users_who_purchased_ids)
  }

  def self.ransackable_scopes(auth_object = nil)
    %i(hasnt_purchased_product_items_in)
  end

然后这有效:

User.ransack({hasnt_purchased_product_items_in: [[1,2,3]]}).result

请注意,搜查需要一组参数。 我们想要一个 arg,它是一个数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM