Сериализация в RoR - структуры, хэши? - PullRequest
1 голос
/ 25 января 2012

Ищет несколько советов о том, как хранить мои данные RoR.По сути, у меня есть около 20 предметов (которые никогда не превысят 50), которые мне нужно отслеживать.Каждый элемент имеет разные координаты X, Y в каждое время дня (один из утром, днем ​​и вечером), и каждый из семи дней недели имеет разное расписание (по сути, 21 разная точка x, y для каждого времени дня)./ день недели комбинации).Он также имеет некоторые статические значения, такие как имя, категория и еще много чего.

Прямо сейчас я пытаюсь решить, как я хочу сохранить это, те 21 различных точек x, y.Я предполагаю, что в спектре есть две противоположные крайности - либо (а) хранить каждое поле, например, wednesday_affter_x, wednesday_afday_y и т. Д., Либо (б) сериализовать и хранить в виде хеша / структуры, например x.wednesday.affter или чего-то еще.Третий вариант может даже состоять в том, чтобы разбить их на отдельные таблицы (т.е. иметь модели: tuesday_item,: wednesday_item и т. Д.)

Одна вещь, которую мне нужно сделать, это поиск / фильтрация по этим полям- например, если я хочу получить элементы, которые находятся в определенной категории для данного TimeOfDay и DayOfWeek.

Есть ли какие-либо рекомендации относительно того, как мне поступить?Спасибо!

1 Ответ

1 голос
/ 25 января 2012

Я бы использовал две таблицы базы данных, одну для элементов и одну для координат. Схема тогда будет простой:

create_table :items do |t|
  t.string :name
  t.string :category
  t.string :whatnot
end

create_table :item_coordinates do |t|
  t.references :item
  t.integer :x
  t.integer :y
  t.string :time_of_day
  t.string :weekday
end

[ОБНОВЛЕНИЕ: Когда вы действительно создаете эти миграции, не забудьте добавить индексы! Для item_coordinates вы, вероятно, хотите объединенный индекс для [:item_id, :weekday, :time_of_day], но не поверьте мне на слово - выясните, какие поля вы фактически используете в качестве ключей, и индексируйте их. Ваша Item модель будет has_many :item_coordinates, а ваша ItemCoordinate модель будет belong_to :item.

Тогда вы можете использовать все обычные методы ActiveRecord. Например, чтобы легко получить определенную координату в этой системе:

item_coordinate = Item.find(item_id).item_coordinates.where(:time_of_day => 'afternoon', :weekday => 'wednesday')
coords = [item_coordinate.x, item_coordinate.y]
...