2013-06-02 3 views
0

Я разрабатываю API REST с Ruby и Sinatra. Только одна проблема, с которой я сталкиваюсь: Я пытаюсь выполнить итерацию по массиву сообщений, выбранных из MySQL. ФорматRuby array.each Возвращая ту же ценность каждый раз

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

Итак, это массив хеша с постом контента и комментариями, а ключ комментариев есть еще один массив и хэш (ы), содержащий автор и содержание комментария.

У меня есть следующий код, потянув массив сообщений из MySQL (возвращенный в массив с хэшами в нем), а затем повторяя эти хэши. Для каждого хэша в массиве он получает идентификатор сообщения и запросы 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 

Странно то, что я могу использовать помещает заявление в петлю, и я буду получать отдельные сообщения

Ex:

r.push(x) 
    puts x 

Но массив (г) просто содержит одни и те же данные снова и снова. Извините за такой длинный пост, я просто хотел быть основательным.

ответ

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 собирает все возвращаемые значения из цикла в массив, поэтому вам не нужно выполнять управление массивом вручную.

+0

Хорошо, я попробовал это. В нем перечислены только сообщения в отдельных хешах. Нет комментариев. –

+0

Вы уверены, что используете 'map', а не' each'? –

+0

Другими словами, возвращается то же самое, что и db.query. –

Смежные вопросы