Sql结果拥有Hash

时间:2013-07-08 13:31:47

标签: ruby-on-rails

如何通过sql结果创建Hash。哈希的关键是结果查询和值是结果。

示例:

UsersPost.select('DISTINCT vk_group_id, MAX(date_send) as md')
  .where('vk_group_id = :vk_group_id ',{:vk_group_id=>39338677}).map do |result|
{result.vk_group_id: result.md}    
end

#=>{'223' => 'dsf'}

但它给了我错误:

  

语法错误,意外'}',期待keyword_end

3 个答案:

答案 0 :(得分:2)

您的ruby版本可能在1.9.3之前。并且它不接受{key: 'value'}之类的新哈希表单并且期待{:key => 'value'}

尝试以下

UsersPost.select('DISTINCT vk_group_id, MAX(date_send) as md')
  .where('vk_group_id = :vk_group_id ',{:vk_group_id=>39338677}).map do |result|
{result.vk_group_id => result.md}    
end

答案 1 :(得分:1)

您应该使用each_with_object来填充哈希

h = UsersPost.select('DISTINCT vk_group_id, MAX(date_send) as md')
      .where('vk_group_id = :vk_group_id ',{:vk_group_id=>39338677})
      .each_with_object({}) { |result, hash| hash[result.vk_group_id] = result.md }

答案 2 :(得分:1)

基本上你需要使用哈希火箭语法:

UsersPost.select('DISTINCT vk_group_id, MAX(date_send) as md')
  .where('vk_group_id = :vk_group_id ',{:vk_group_id=>39338677}).map do |result|
  {result.vk_group_id => result.md}    
end

但这会给你一系列哈希。尝试使用注入。

UsersPost.select('DISTINCT vk_group_id, MAX(date_send) as md')
  .where('vk_group_id = :vk_group_id ',{:vk_group_id=>39338677}).inject({}) do |hash, user_post|
  hash[user_post.vk_group_id] = user_post.md   
end

each_with_object也可以,但这是一个RoR方法而不是ruby。如果有红宝石,我更喜欢使用红宝石。