2012-01-25 47 views
1

尋找一些關於如何存儲我的RoR數據的建議。基本上,我有20個左右的項目(永遠不會超過50),我需要跟蹤。每個項目在一天中的每個時間點(不論是上午,下午還是晚上)都有不同的X,Y座標,並且每個七個工作日都有不同的時間表(基本上,每天的每個時間點有21個不同的x,y點/星期的組合)。它也有一些靜態值,比如名稱,類別和什麼。RoR中的序列化 - 結構體,哈希,?

現在我正在試圖決定如何存儲它,這21個不同的x,y點。我想在頻譜上有兩個相反的極端 - 或者(a)存儲每個字段,如wednesday_afternoon_x,wednesday_afternoon_y等等,或者(b)序列化並存儲爲散列/結構,如x.wednesday.afternoon或其他。第三種選擇甚至可能是將它們分解成單獨的表(即:有:tuesday_item,:wednesday_item模型等)

我需要做的一件事就是搜索/過濾這些字段 - for例如,如果我想獲取給定TimeOfDay和DayOfWeek的特定類別內的項目。

對於我應該如何進行,有什麼建議嗎?謝謝!

回答

1

我會使用兩個數據庫表,一個用於項目,一個用於座標。然後該模式將是簡單:

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] 
+0

聖牛,這是天才。我會試試這個,並讓你知道會發生什麼 – Josiah

+0

我剛剛添加了一個更新,提醒您在實際創建這些遷移時添加索引。 –

+0

這工作真的很棒,謝謝! – Josiah