使用主键作为活动记录读取的索引,Rails

时间:2017-11-18 02:57:51

标签: ruby-on-rails activerecord hash

当我使用users = User.where(...)时 我可以使用users.find(id)来查找它的id

我想使用哈希,以便我可以使用users [id]作为搜索方式,其中id成为哈希的索引。

我该怎么做?

我试过了:

div {
  display: inline-block;
}

这些都没有将主键转换为索引

2 个答案:

答案 0 :(得分:3)

要将任何Enumerable转换为哈希,您可以使用ActiveSupport (activesupport/lib/active_support/core_ext/enumerable.rb)中的index_by

users = User.where(...)
users.index_by(&:id)
# => { 1 => <User ...>, 2 => <User ...>, ...}

# note the difference between 'index_by' and 'group_by' where the latter will return an array of a single User for each id
users.group_by(&:id)
# => { 1 => [<User ...>], 2 => [<User ...>], ...}

由于ActiveRecord::Relation在其祖先链中包含Enumerable模块(您可以通过ActiveRecord::Relation.ancestors.include? Enumerable进行检查),您可以在任何Enumerable上使用任何ActiveRecord::Relation实例方法对象。

答案 1 :(得分:2)

针对您的特定需求的解决方案

indexed_users = [] # holds users on index as id

users.each {|u| indexed_users[u.id] = u.attributes }

同样将id转换为索引并不是一个好主意,因为如果id变得大了大约数千左右并且id不是顺序的,则数组大小可能会失控。喜欢 users = [<id: 1>, <id:200>]将生成大小为201的数组。

更新以获取哈希是关键

users.map(&:attributes).group_by { |attr| attr[:id] }