使用ransack按空列表搜索多对多关系

时间:2014-09-10 13:24:50

标签: ruby-on-rails ransack

我搜索了如何将空数组传递给ransack,例如:

@search = PromotionsRetailer.search(retailer_id_in: [])

这个sql语句:

"SELECT `promotions_retailers`.* FROM `promotions_retailers` "

我找到了这个link,将-1添加到空数组,所以我使用了search(retailer_id_in: ([] + [-1]))

  1. 任何解决方案都比这个解决方案好吗?
  2. 如果我在促销/零售商之间有多对多的关系,而不使用ransack gemretailer_id分区表,那么如何在促销表中使用PromotionsRetailer进行搜索?

1 个答案:

答案 0 :(得分:0)

问题的第一部分至关重要。这应该是一个单独的问题。

不幸的是,没有更优雅的方式来应对它,而不是:

search(retailer_id_in: ([] + [-1]))

问题出在宝石的某个地方。如果您传递空数组或填充了nil值的数组作为参数,则会在SQL中加入,但所有条件都将被忽略,例如:

红宝石:

Article.ransack({authors_id_in: [nil, nil, nil]}).result

SQL:

SELECT "articles".* FROM "articles" LEFT OUTER JOIN "articles_authors" ON "articles_authors"."article_id" = "articles"."id" LEFT OUTER JOIN "authors" ON "authors"."id" = "articles_authors"."author_id"

你的第二部分问题是关于使用搜索来搜索HABTM关系,Rails 3.1 Ransack HABTM中对此进行了解释。

因此:

Promotion.ransack({retailer_id_in: [1,2,3]}).result

您不应该使用PromotionsRetailer类本身。