无视地疯狂搜查 true/false

ransack search in spree ignoring true/false

我正在尝试在 is_masterfalse 的 spree 中查找所有变体,但搜查没有按预期工作。我使用 ransack 的原因是这样我就可以 运行 对 spree 进行搜索 api 这样我就可以发出像 /api/v1/variants?q[is_master_true]='0' 这样的请求来获取所有非主变体。

documentation

>> User.ransack(awesome_false: '1').result.to_sql
=> SELECT "users".* FROM "users"  WHERE ("users"."awesome" = 'f')

在实践中

> Spree::Variant.ransack(is_master_false: '1').result.to_sql
=> "SELECT \"spree_variants\".* FROM \"spree_variants\" WHERE \"spree_variants\".\"deleted_at\" IS NULL" 

is_master_false在sql

中被忽略

另一个类似 sku_eq 的搜索工作正常

> Spree::Variant.ransack(sku_eq: '17636').result.to_sql
=> "SELECT \"spree_variants\".* FROM \"spree_variants\" WHERE \"spree_variants\".\"deleted_at\" IS NULL AND \"spree_variants\".\"sku\" = '17636'" 

为什么 is_master_false: '1' 对创建的 sql 查询不执行任何操作,而不是在 is_master = false 中查找记录?

@Qwertie:对于搜查搜索,您需要首先将要执行搜查搜索的所有属性列入白名单。

目前,在 Variant model 中只有 weight sku 被列入白名单。

所以你需要自己将is_master字段列入白名单

为此,只需为 spree/models 中的变体创建一个装饰器,名称为 variant_decorator.rb 并写入

Spree::Variant.class_eval do
  ### WHITELISTED ATTRIBUTES ###
  self.whitelisted_ransackable_attributes |= ['is_master']
end

或在spree.rb 添加 Spree::Variant.whitelisted_ransackable_attributes.push('is_master')

现在重新启动您的服务器或 rails 控制台并尝试一下。