在activerecord中通过多个id获取分组值

a7qyws3x  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(270)

对不起,英语不好
我的ruby代码中有一个id数组。
例子:

[[10], [], [10, 1, 3], []]

我能装货吗 User mysql表中的模型 users 在一个查询中保存分组?
例子:

[[#<User id=10>], [], [#<User id=10>, #<User id=1>, #<User id=3>], []]

环境:ruby 2.5.1 | rails 5 | mysql
找到解决方案之一:
我可以将我的ID数组展开,并将该数组中的模型加载到哈希中:

hash = User.where(id: array.flatten).index_by(&:id)

然后,在迭代过程中,通过数组,我可以按正确的顺序从哈希加载对象,如下所示:

array.each do |ids|
  users = ids.map { |id| hash[id] }
  # do smth
end
dluptydi

dluptydi1#

这很简单:对数组使用展平方法:

ids = [[123], [], [123, 1, 3, 4], [70, 80]]
user_ids = ids.flatten.reject(&:blank?).uniq
users = User.where(id: user_ids)

编辑:不适合您的需要的最佳(递归)方法:

def map_users_by_id(ids_array:, users:)
  result = []
  ids_array.each do |array_element|
    if (array_element).is_a? Array
      result << map_users_by_id(ids_array: array_element, users: users)
    else
      result << users[array_element]
    end
  end
  return result
end

ids = [[123], [], [123, 1, 3, 4], [70, 80]]
user_ids = ids.flatten.reject(&:blank?).uniq
users = Hash[User.where(id: user_ids).map{|user|[user.id, user]}]
result = map_users_by_id(ids_array: ids, users: users)

相关问题