[英]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 查询。
我会尝试每一个:
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
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 上。 如果您能告诉我目标(例如过滤用户的产品推荐以排除他们的购买),那么我可以更新答案。
用户.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.