0

Ruby と Sinatra を使用して REST API を設計しています。私が抱えている問題は 1 つだけです。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 に答える