2013-07-08 56 views
0

如何通过sql结果创建哈希。哈希键是结果查询,它是结果的值。sql自己的哈希结果

例子:

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'} 

但它给我的错误:

syntax error, unexpected '}', expecting keyword_end

+0

如果你正在得到结果'#=> {'223'=>'dsf'}'这只是意味着上面的代码没有问题,并且你在别的地方得到错误 – Salil

回答

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

它可能可能是你的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 
+0

只写了相同的答案,但是你先发布它:) –

+0

这个解决方案返回一个散列数组,但我认为OP正在寻找所有结果的单个散列。 – Baldrick

+0

@Baldrick: - 可能是,但我只是回答了他的问题'语法错误,意外'}',期待keyword_end' – Salil

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。如果可用,我更喜欢使用红宝石。