Ruby on rails 将自定义范围与Ransack一起使用
我有一个Ruby on rails 将自定义范围与Ransack一起使用,ruby-on-rails,ruby,scope,ransack,Ruby On Rails,Ruby,Scope,Ransack,我有一个产品模型,它属于客户模型,而客户模型又属于债务人模型 我需要能够通过客户和/或债务人(如何使用Ransack?)搜索产品,并且基于提供客户和/或债务人,我需要根据自定义条件应用一些自定义范围。例如: 如果我提供了一个客户端,如果condition1为true,我希望应用scope1。所以Product.search(client:@client)也会在后台执行Product.scope1,如果条件1 如果我同时提供客户和债务人,如果条件2为真,我希望应用范围2。因此Product.se
产品
模型,它属于客户
模型,而客户模型又属于债务人
模型
我需要能够通过客户
和/或债务人
(如何使用Ransack?)搜索产品
,并且基于提供客户
和/或债务人
,我需要根据自定义条件应用一些自定义范围。例如:
- 如果我提供了一个
,如果客户端
为true,我希望应用condition1
。所以scope1
也会在后台执行Product.search(client:@client)
李>Product.scope1,如果条件1
- 如果我同时提供
和客户
,如果债务人
为真,我希望应用条件2
。因此范围2
也会在后台执行Product.search(客户端:@client,债务人:@debuster)
)Product.scope2(如果条件2
希望你理解我想要实现的目标。我研究了如何在模型上定义
ransacker
,但不知道如何根据某些条件向结果中添加作用域。任何帮助都将不胜感激 无法为你的应用程序编写工作代码,因为缺少信息
但有时,我需要按某个范围过滤搜索结果,例如,当它签入表单时(可选)
我使用具有自定义范围的洗劫器的方式如下:
应用程序内/ransackers/custom_ransacker.rb
class CustomRansacker < BaseRansacker
# value param - is passed from form, it can be string, integer, boolean, what ever.
# you can use it, to decide which scope to apply, for example
def eq(value)
table[:id].in(model_ids)
end
def model_ids
MyModel.my_scope.map(&:id)
end
end
app/models/my_model.rb
class MyModel < AR::Base
scope :my_scope, ->{ # some conditions }
ransacker :some_field_name, callable: CustomRansacker
end
classmymodel{一些条件}
ransacker:some\u field\u name,可调用:CustomRansacker
结束
OK,据我所知,Ransack只生成一个SQL查询,所以为了应用一些自定义范围,我需要运行这些范围,获取它们的ID,然后在自定义Ransacker中使用它们来构建自定义SQL查询。是吗?是的,这是我理解的可能的差异之一。如果我能在定义Ransacker时直接使用作用域,那就太好了……好吧,你可以在CustomRansacker类中定义你的自定义查询,没有作用域,只是简单的条件,比如“MyModel.where('some condition')”,但我仍然需要获得ID才能构建Ransack需要返回的查询。
class MyModel < AR::Base
scope :my_scope, ->{ # some conditions }
ransacker :some_field_name, callable: CustomRansacker
end