ransack搜索狂欢忽略真/假

时间:2017-07-10 03:33:26

标签: ruby-on-rails ruby spree ransack

我正在尝试在is_masterfalse的spree中查找所有变体但是ransack未按预期工作。我使用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" 

在sql中忽略is_master_false

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所在的记录?

1 个答案:

答案 0 :(得分:1)

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

目前,仅Variant model 权重sku 列入白名单。

因此您需要自己将 is_master 字段列入白名单

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

Spree::Variant.whitelisted_ransackable_attributes.push('is_master')

或者在spree.rb中 添加DECLARE @SQLString NVARCHAR(MAX); SET @SQLString = '<query>' EXEC (@SQLString);

现在重新启动服务器或rails控制台并试用它。