【发布时间】:2020-10-08 11:02:04
【问题描述】:
我正在尝试将几个 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 阶段对传入参数做一些事情,但我不确定如何处理
【问题讨论】:
-
您是否检查过
params[:q][:hasnt_purchased_product_items_in]是您所期望的数组? -
该 ransacker 行的性质 - proc { |product_id| } 意味着我会自动进入数组并检索值,这就是它运行 SQL 行两次的原因。 - 如果有办法将 id 作为字符串提交?
-
是的,但它不应该介入。参数应该是
|product_ids|并在 proc 中给我们一个数组对象,然后使用它。我会发布一些想法作为答案,如果它们不起作用,我会删除。 -
使用 _in 会导致 noMethodError - nil:NilClass 的未定义方法 `klass'
标签: mysql arrays ruby-on-rails activeadmin ransack