Ruby on rails 展平ActiveRecord::关系实例数组

Ruby on rails 展平ActiveRecord::关系实例数组,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我想转换ActiveRecord::Relation对象的嵌套数组,如下所示: # Event is a ActiveRecord::Base derived class r1 = [ [ Event.where(id: 1) ], Event.where(id: 1)] # => [ [ #<ActiveRecord::Relation []> ], #<ActiveRecord::Relation[]> ] enumerable#map也不起作用: r1.ma

我想转换
ActiveRecord::Relation
对象的嵌套数组,如下所示:

# Event is a ActiveRecord::Base derived class
r1 = [ [ Event.where(id: 1) ], Event.where(id: 1)]
# => [ [ #<ActiveRecord::Relation []> ], #<ActiveRecord::Relation[]> ]
enumerable#map
也不起作用:

r1.map{|m| m.limit(10) } # => []
Enumerable#flat_map
返回一个稍有不同的结果:

r1.flat_map{|m| m.limit(10) } # => [ #<ActiveRecord::Relation []> ]
r1.flat|u映射{| m | m.limit(10)}
最后,在数组上循环并推入另一个空数组将返回预期结果:

r1.flatten # => []
z = []
r1.each {|e| if e.is_a?(Array) then e.each{|x| z << x} else z << e end}
# => [#<ActiveRecord::Relation []>, #<ActiveRecord::Relation []> ]
z=[]

r1.each{e}如果e.是一个?(数组),那么e.each{x}z就是你看到的结果,因为当你枚举关系(或将其转换为数组)时,它不包含任何元素


您可以在关系的打印输出中看到这一点,它的
[]
就在
>
之前。如果其中有任何内容,您会看到括号内的元素。

您得到的是您看到的结果,因为当您枚举关系(或将其转换为数组)时,它不包含任何元素


您可以在关系的打印输出中看到这一点,其中包含
[]
就在
之前。如果其中有任何内容,您将看到括号内的元素。

当您执行
.flant
时,该方法将触发由要执行的关系包装的SQL查询。然后,查询结果将被展平

在您的例子中,两个查询似乎都返回了一个空记录集

r1 = [ [ Event.where(id: 1) ], Event.where(id: 1)]
评定为

r1 = [ [[]] , []]
指数随着时间的推移而变平

[]
如果您使用产生结果的作用域尝试代码,那么您将看到展平将返回记录数组

为了使作用域平坦化,您需要像以前一样使用自定义方法

def flatten_scopes(scopes)
  scopes.inject([]) { |a,r| r.is_a?(Array) ? a += flatten_scopes(r) : a.push(r) }
end

flatten_scopes(r1)

执行
.flant
时,该方法将触发由要执行的关系包装的SQL查询。然后,查询结果将被展平

在您的例子中,两个查询似乎都返回了一个空记录集

r1 = [ [ Event.where(id: 1) ], Event.where(id: 1)]
评定为

r1 = [ [[]] , []]
指数随着时间的推移而变平

[]
如果您使用产生结果的作用域尝试代码,那么您将看到展平将返回记录数组

为了使作用域平坦化,您需要像以前一样使用自定义方法

def flatten_scopes(scopes)
  scopes.inject([]) { |a,r| r.is_a?(Array) ? a += flatten_scopes(r) : a.push(r) }
end

flatten_scopes(r1)

谢谢。对。将在合适的地方介绍类似的方法。谢谢。对。将在合适的地方介绍类似的方法。