简体   繁体   English

使用ActiveRecord获取与所选值对应的哈希数组

[英]Get an array of hashes corresponding to the selected values with ActiveRecord

I have a sql database that I query with ActiveRecord. 我有一个用ActiveRecord查询的SQL数据库。 (version of ActiveRecord is 4.2.5.1) (ActiveRecord的版本为4.2.5.1)

My query look like this: 我的查询如下所示:

User.
  select('COUNT (DISTINCT user_id) as user_count').
  select("date_trunc('month', created_at) as month").
  select('city').
  where('created_at > ?', 1.year.ago.utc.to_s(:db)).
  group('month, city').
  to_a.map do |row|
  {
    user_count: row.user_count,
    month: row.month,
    city: row.city
  }

And I get results like this: 我得到这样的结果:

[
    [  0] {
        :user_count => 165,
             :month => 2015-09-01 00:00:00 UTC,
              :city => "Paris"
    },
    [  1] {
        :user_count => 33,
             :month => 2015-09-01 00:00:00 UTC,
              :city => "Berlin"
    },
    ...
]

And this is fine. 这很好。

However, with this query: 但是,使用此查询:

User.
  select('COUNT (DISTINCT user_id) as user_count').
  select("date_trunc('month', created_at) as month").
  select('city').
  where('created_at > ?', 1.year.ago.utc.to_s(:db)).
  group('month, city').
  to_a

I get results like this: 我得到这样的结果:

[
    [  0] #<User:0x007facebac3560> {
           :user_id => nil,    # wtf is this
              :city => "Paris"
                               # where is the month?
    },
    [  1] #<User:0x007facebac33a8> {
           :user_id => nil,
              :city => "Berlin"
    },
    ...
]

Which is not fine. 哪个不好

Why do I have to manually map the results even when I selected the rows I wanted? 为什么即使选择了想要的行也必须手动映射结果?

Ideally, what I want is this: 理想情况下,我想要的是:

User.
  select(...).
  where(...).
  group(...).
  to_array_of_hashes_with_the_keys_i_selected

Notice that if my query is a custom query, to_a does what I want, for example: 请注意,如果我的查询是自定义查询,则to_a会执行我想要的操作,例如:

ActiveRecord::Base.connection.execute(<<~SQL
  SELECT COUNT (DISTINCT user_id) as user_count, date_trunc('month', created_at) as month,  city
  FROM users
  WHERE created_at > '2015-09-01 13:28:40'
  GROUP BY month, city
SQL
).to_a # this is fine

From How to convert activerecord results into a array of hashes , I can do: 如何将activerecord结果转换为哈希数组 ,我可以做到:

User.
  select(...).
  where(...).
  group(...).
  as_json

And I get 我得到

[
    [  0] {
           "user_id" => nil,
              "city" => "Paris",
        "user_count" => 165,
             "month" => 2015-09-01 00:00:00 UTC
    },
    ...

Not exactly what I selected, but close enough. 不完全是我选择的,但足够接近。

.as_json.map{|e|e.except('user_id')} gives me what I want .as_json.map{|e|e.except('user_id')}给了我我想要的

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM