Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.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 Ruby where子句中的多个动态变量_Ruby On Rails_Ruby_Join_Dynamic_Where - Fatal编程技术网

Ruby on rails Ruby where子句中的多个动态变量

Ruby on rails Ruby where子句中的多个动态变量,ruby-on-rails,ruby,join,dynamic,where,Ruby On Rails,Ruby,Join,Dynamic,Where,我有一个以下的joins/where子句: Trail.joins(:filters).where(filters: { param: "family-friendly", param: "over-18" }) 变量家庭友好型和over-18将从数组中动态加载: f = ["family-friendly", "over-18"] 假设我不知道将有多少个元素,如何调整上面的where子句来动态添加数组中的元素 我尝试在数组上使用。每个do | f |方法并替换为param:f,但这似乎覆盖

我有一个以下的joins/where子句:

Trail.joins(:filters).where(filters: { param: "family-friendly", param: "over-18" })
变量
家庭友好型
over-18
将从数组中动态加载:

f = ["family-friendly", "over-18"]
假设我不知道将有多少个元素,如何调整上面的where子句来动态添加数组中的元素

我尝试在数组上使用
。每个do | f |
方法并替换为
param:f
,但这似乎覆盖了最初的发现

有什么想法吗

编辑


看起来我的代码实际上不起作用。它只返回param的secodn实例('over-18')。我正在查找数组中声明了所有相关筛选器的所有跟踪。

要选择包含数组中指定的所有
筛选器的所有
跟踪
,可以在PostgreSQL中使用
GROUP BY
HAVING
子句:

f = ["family-friendly", "over-18"]
Trail.joins(:filters).group('trails.id').having(
  'array_agg(CAST(filters.param AS text)) @> ARRAY[?]', f)
这种解决方案的缺点是它只适用于PostgreSQL

另见:

  • -
    array\u agg
  • -
    @>
    操作员

    • 这可能不是最好的解决方案,但似乎有效:

      filtered_trails = []
      trails.each do |t|
        if (filters -  t.filters.collect(&:param)).empty?
          filtered_trails << t.id
        end
      end
      result = Trail.where(id: filtered_trails)
      
      filtered_trails=[]
      每一条都有|
      如果(filters-t.filters.collect(&:param)).empty?
      
      你是说使用
      还是
      运算符?我想使用和运算符。我认为这就是上面代码在工作时所做的。只需要从数组中加载它们。如果你想使用,为什么要对同一个属性请求两次,请求的值不同?这不是一个OR吗?据我所知,我的代码基本上使用AND运算符?我不确定,但当我在控制台中测试它时,它似乎可以工作。它将只返回具有两个关联筛选器的轨迹。知道我如何动态加载这些吗?@MikeHolford你应该小心;包含两次
      param
      键不会使用AND运算符。相反,分配给
      param
      键(“over-18”)的最后一个值用于生成查询。您的目标是选择包含数组中指定的所有过滤器的所有
      轨迹吗?谢谢@w_hile选中,但我在dev中使用SQLite,因此它不适用于编写的MEA,您有一个N+2查询问题。为了提高性能,您可以编写
      trails.includes(:filters).each…
      来为每个trails加载过滤器。在这种情况下,您将只执行三个查询,而不是N+2(N=以DB为单位的跟踪数)。