Ruby on Rails Array доступ - PullRequest
       7

Ruby on Rails Array доступ

0 голосов
/ 08 марта 2009

Моя проблема связана с массивом, который, очевидно, не равен нулю, но когда я пытаюсь получить к нему доступ, он есть.

Массив возвращается из находки в активной записи. Я подтвердил, что на самом деле это массив с методом .class

@show_times = Showing.find_showtimes(params[:id])
@show_times.inspect =>shows that the array is not empty and is a multidimensional array.
@show_times[0] =>is nil
@show_times[1] =>is nil
@show_times.first.inspect => NoMethodError (undefined method `first')

Я озадачен тем, почему это ..

Ответы [ 3 ]

3 голосов
/ 08 марта 2009

Это не массив, это магическая структура активной записи, которая в основном похожа на массив. Я думаю, что вы можете сделать to_a, чтобы получить реальный массив, но тогда большая часть магии исчезнет.

2 голосов
/ 08 марта 2009

find_showtimes не является встроенным искателем - если бы он был, он возвратил бы или единственный объект ActiveRecord или массив объектов ActiveRecord - никогда не многомерный массив. Поэтому первое, что я хотел бы сделать, это взглянуть на источник этого метода.

РЕДАКТИРОВАТЬ: Учитывая ваш исходный код (в комментарии) - вы на самом деле получаете хеш, а не массив, от вашего искателя. См. документы для Enumerable's group_by . Хэш отображает ваши театральные объекты в массив показывающих объектов. Это то, что вы хотите сделать:

Showing.find_showtimes(params[:id]).each do |theater, showtimes|
  puts "Theater #{theater} is showing the movie at #{showtimes.join(', ')}"
end
0 голосов
/ 11 марта 2009

Если вы находитесь в консоли и хотите исследовать объект @show_times, вы можете использовать метод keys, чтобы увидеть все хеш-ключи, а затем перейти к отдельным хеш-элементам (таким как все времена показа) следующим образом:

@show_times[:theater_one]

То же самое будет работать в вашей модели / представлении, но использование каждого / map / collect будет более понятным, если использовать красивый код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...