Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将自定义范围与Ransack一起使用_Ruby On Rails_Ruby_Scope_Ransack - Fatal编程技术网

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?)搜索
产品
,并且基于提供
客户
和/或
债务人
,我需要根据自定义条件应用一些自定义范围。例如:

  • 如果我提供了一个
    客户端
    ,如果
    condition1
    为true,我希望应用
    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