Самый эффективный способ сортировки записей MotionModel в разделы на основе даты для вставки в ProMotion TableScreen?

Я использую RubyMotion, ProMotion и MotionModel для приложения iOS. Мы будем хранить несколько записей, чувствительных к дате/времени, в день и перечислять их в большом TableView. Прямо сейчас записи отображаются в одном большом списке:

введите здесь описание изображения

Я бы хотел, чтобы записи были сегментированы по дате для лучшей читабельности:

введите здесь описание изображения

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

Если кто-то читает это, знает Ruby или RubyMotion, но не знаком с ProMotion, формат данных, который мне нужно вернуть, имеет следующий формат:

[{
  title: "June 12, 2013",
  cells: [{
    title: "10:00am"
  },{
    title: "3:15pm"
  },{
    title: "7:00pm"
  },{
    title: "10:15pm"
  }]
},{
  title: "June 06, 2013",
  cells: [{
    title: "10:00am"
  },{
    title: "3:15pm"
  },{
    title: "7:00pm"
  },{
    title: "10:15pm"
  }]
}]

РЕДАКТИРОВАТЬ:

Текущий код, генерирующий ячейки таблицы в обратном хронологическом порядке:

[{
  cells: Entries.order{|one, two| two.entry_date <=> one.entry_date}.all.map{ |f|
    {
    title: Time.at(f.entry_date).strftime("%I:%M %p"), #"%m/%d/%Y"
    action: :show_entry,
    arguments: 
      {
        entry: f 
      }
    }
  }
}]

person Denny    schedule 27.06.2013    source источник


Ответы (1)


Предполагая, что times имеет ваш массив экземпляров Time:

df=NSDateFormatter.new.tap { |f| f.setDateStyle(NSDateFormatterMediumStyle) }
tf=NSDateFormatter.new.tap { |f| f.setTimeStyle(NSDateFormatterMediumStyle) }
times.inject({}) { |a, t|  (a[df.stringFromDate(t)] ||= []) << 
  tf.stringFromDate(t); a }.map { |k, v| Hash[title: k, cells: v.map { |t| {title: t} } ] }
person aceofspades    schedule 27.06.2013
comment
Вот это да. Пытался разобраться в этом, но, думаю, мне нужно кое-чему научиться :) Поэтому вместо этого я попытался обновить его, чтобы интегрировать информацию из моей модели, а затем у меня произошел сбой. Я должен был включить его раньше, но теперь отредактировал сообщение, чтобы показать мой текущий код генерации таблицы. Знаете какой-нибудь способ интегрировать их? И какие-либо ресурсы, которые вы предлагаете, чтобы ускорить работу с этим расширенным материалом для отображения данных? Удивительно получать помощь, когда она мне нужна, но я также хотел бы понимать, что происходит. - person Denny; 28.06.2013
comment
Разбейте его на части, т.е. до вызова карты, и посмотрите, что у вас получится. Понимание того, как использовать инъекции, сопоставление и динамическое построение хэшей, — это время, потраченное с пользой при изучении ruby. - person aceofspades; 28.06.2013
comment
РЕДАКТИРОВАТЬ: Неважно, он уже делает это. (предыдущий) Да, вы захотите пройтись по хэшу, который @aceofspades создает здесь, а затем отформатировать свои группы в массив хэшей соответствующим образом. Что-то вроде time_hash.each { |title, cells| { title: title, cells: cells } } - person Jamon Holmgren; 28.06.2013
comment
Спасибо за помощь, ребята. Есть чему поучиться, но рано или поздно научусь :) - person Denny; 29.06.2013