0

我正在用 Ruby 和 Sinatra 设计一个 REST API。我只有一个问题:我正在尝试迭代从 MySQL 中选择的一系列帖子。格式是

[{:post => "Hello, world!", :comments => [{:author => "user1", :content => "Goodbye, world!"}]}, ...]

因此,它是一个包含内容帖子和评论的散列数组,而评论键具有另一个数组和包含评论作者和内容的散列。

我有以下代码从 MySQL 中提取一组帖子(以包含哈希的数组返回),然后遍历这些哈希。对于数组中的每个散列,它获取帖子 ID 并查询 MySQL 以获取与该帖子关联的任何评论。然后它将帖子和评论推送到哈希,这是推送到返回的数组。

def get_post(id = 'null', profile = 'null', owner = 'null')
        r = Array.new
        x = Hash.new
        p = self.query("SELECT * FROM `posts` WHERE `id` = '#{id}' OR `post_profile` = '#{profile}' OR `post_owner` = '#{owner}'")
        p.each do |i|
            x[:post] = i
            x[:comments] = self.query("SELECT * FROM `comments` WHERE `post` = '#{i["id"]}'")
            r.push(x)
        end
        return r
end

奇怪的是我可以在循环中使用 puts 语句,我会得到各个帖子

前任:

r.push(x)
    puts x

但是数组 (r) 只是一遍又一遍地包含相同的数据。对不起,这么长的帖子,我只是想彻底。

4

1 回答 1

2

您不断将相同的 Hash 实例推送到数组上,而不是创建新的哈希值。尝试这个:

def get_post(id = 'null', profile = 'null', owner = 'null')
  p = self.query("SELECT * FROM `posts` WHERE `id` = '#{id}' OR `post_profile` = '#{profile}' OR `post_owner` = '#{owner}'")
  p.map do |i|
    {
      post: i,
      comments: self.query("SELECT * FROM `comments` WHERE `post` = '#{i["id"]}'")
    }
  end
end

这样做是遍历帖子(使用map而不是each,我稍后会解释),并且对于每个帖子,返回一个包含所需数据的新哈希。map方法将循环中的所有返回值收集到一个数组中,因此您不必进行任何手动数组管理。

于 2013-06-02T01:27:47.097 回答