Ruby on rails Ruby where子句中的多个动态变量
我有一个以下的joins/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,但这似乎覆盖
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为单位的跟踪数)。