2012-10-30 80 views
0

我有我的這種結構數據庫30K +文件:訪問/設置嵌套值與表單

{ 
    ..., 
    "hours" : { 
    "holiday" : { 
     "New Years" : "Call", 
     "Easter" : "Closed", 
     "Memorial Day" : "Standard", 
     "Independence Day" : "Standard", 
     "Labor Day" : "Standard", 
     "Thanksgiving" : "Closed", 
     "Day After Thanksgiving" : "Call", 
     "Christmas Eve" : "Call", 
     "Christmas" : "Closed", 
     "New Years Eve" : "Call" 
    }, 
    "standard" : { 
     "mon" : [{ 
     "open" : "8:00 am", 
     "close" : "11:00 pm" 
     }], 
     "tue" : [{ 
     "open" : "8:00 am", 
     "close" : "11:00 pm" 
     }], 
     "wed" : [{ 
     "open" : "8:00 am", 
     "close" : "11:00 pm" 
     }], 
     "thu" : [{ 
     "open" : "8:00 am", 
     "close" : "11:00 pm" 
     }], 
     "fri" : [{ 
     "open" : "8:00 am", 
     "close" : "11:00 pm" 
     }], 
     "sat" : [{ 
     "open" : "8:00 am", 
     "close" : "11:00 pm" 
     }], 
     "sun" : [{ 
     "open" : "8:00 am", 
     "close" : "10:00 pm" 
     }] 
    } 
    }, 
    ... 
} 

我做從PHP驅動的網站完全重寫。我一直在絞盡腦汁,絕對不可能想出一種方法來創建一個表單域,使我能夠正確設置business.hours [「standard」] [「mon」]。該網站每天提供多個打開/關閉條目,用於午餐關閉的企業等。該屬性將設置爲[{「打開」:「上午8:00」,「關閉」:「中午12:00}, {「開放」:「下午1點」,「關閉」:「下午5點}]在這種情況下。我想爲每個條目提供兩個選擇框,一個用於開放時間,另一個用於關閉時間。

這是我的模型。包括我試圖弄清楚如何綁定到我的表單中的一些getter/setter ...失敗。

class Business 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    field :ad, type: String 
    field :address, type: String 
    field :city, type: String 
    field :claimed, type: Boolean 
    field :coupons, type: String 
    field :created_at, type: DateTime 
    field :extra_services, type: Array 
    field :hours, type: Hash 
    field :name, type: String 
    field :organization, type: String 
    field :permanently_closed, type: Boolean, :default => false 
    field :phone, type: String 
    field :state, type: String 
    field :tags, type: Array 
    field :unit, type: String 
    field :updated_at, type: DateTime 
    field :website, type: String 
    field :zip, type: String 

    attr_accessible :ad, :address, :city, :claimed, :coupons, :created_at, :updated_at, :extra_services, :hours, 
        :name, :organization, :permanently_closed, :phone, :state, :tags, :unit, :website, :zip 

    index({address: 1, unit: 1, city: 1, state: 1, zip: 1, organization: 1}, {unique: true, name: "address_unique_index"}) 

    after_initialize do |b| 
    b.hours = Hash.new unless b.hours 
    b.hours["holiday_hours"] = {"New Years" => "Call", 
           "Easter" => "Call", 
           "Memorial Day" => "Call", 
           "Independence Day" => "Call", 
           "Labor Day" => "Call", 
           "Thanksgiving" => "Call", 
           "Day After Thanksgiving" => "Call", 
           "Christmas Eve" => "Call", 
           "Christmas" => "Call", 
           "New Years Eve" => "Call"} unless b.hours["holiday_hours"] 

    b.hours["standard_hours"] = Hash.new unless b.hours["standard_hours"] 
    end 

    def holiday_hours 
    hours["holiday_hours"] if hours["holiday_hours"] 
    end 

    def holiday_hours=(hours) 
    self.hours["holiday_hours"] = hours if hours.present? 
    end 

    def holiday_hours_for(holiday) 
    hours["holiday_hours"][holiday.to_s] if hours["holiday_hours"][holiday.to_s] 
    end 

    def update_holiday_hours_for(holiday, hours_text) 
    self.hours = Hash.new unless hours 
    self.hours["holiday_hours"] = Hash.new unless hours["holiday_hours"] 
    self.hours["holiday_hours"][holiday.to_s] = hours_text.to_s 
    end 

    def standard_hours 
    hours["standard_hours"] if hours["standard_hours"] 
    end 

    def standard_hours_for(day) 
    hours["standard_hours"][day.to_s] if hours["standard_hours"][day.to_s] 
    end 
end 

謝謝!

回答

0

我想出了一個辦法,雖然我不是100%確定這是正確的方法。

attr_accessible :ad, :address, :city, :claimed, :coupons, :created_at, :updated_at, :extra_services, :hours, 
       :name, :organization, :permanently_closed, :phone, :state, :tags, :unit, :website, :zip, 
       :hours_mon_open, :hours_mon_close, :hours_tue_open, :hours_tue_close, :hours_wed_open, 
       :hours_wed_close, :hours_thu_open, :hours_thu_close, :hours_fri_open, :hours_fri_close, 
       :hours_sat_open, :hours_sat_close, :hours_sun_open, :hours_sun_close 

attr_accessor :hours_mon_open, :hours_mon_close, :hours_tue_open, :hours_tue_close, :hours_wed_open, 
       :hours_wed_close, :hours_thu_open, :hours_thu_close, :hours_fri_open, :hours_fri_close, 
       :hours_sat_open, :hours_sat_close, :hours_sun_open, :hours_sun_close 



before_save :parse_hours 

def parse_hours 
    h = Array.new 

    if hours_mon_open.present? && hours_mon_close.present? && hours_mon_open.count == hours_mon_close.count 
    h = Array.new 
    i = 0 
    while i < hours_mon_open.count 
     hs = build_hours_set(hours_mon_open[i], hours_mon_close[i]) 
     h.push(hs) unless hs.nil? 
     i += 1 
    end 

    if h.count > 0 
     update_standard_hours_for("mon", h) 
    end 
    end 

    if hours_tue_open.present? && hours_tue_close.present? && hours_tue_open.count == hours_tue_close.count 
    h = Array.new 
    i = 0 
    while i < hours_tue_open.count 
     hs = build_hours_set(hours_tue_open[i], hours_tue_close[i]) 
     h.push(hs) unless hs.nil? 
     i += 1 
    end 

    if h.count > 0 
     update_standard_hours_for("tue", h) 
    end 
    end 

    if hours_wed_open.present? && hours_wed_close.present? && hours_wed_open.count == hours_wed_close.count 
    h = Array.new 
    i = 0 
    while i < hours_wed_open.count 
     hs = build_hours_set(hours_wed_open[i], hours_wed_close[i]) 
     h.push(hs) unless hs.nil? 
     i += 1 
    end 

    if h.count > 0 
     update_standard_hours_for("wed", h) 
    end 
    end 

    if hours_thu_open.present? && hours_thu_close.present? && hours_thu_open.count == hours_thu_close.count 
    h = Array.new 
    i = 0 
    while i < hours_thu_open.count 
     hs = build_hours_set(hours_thu_open[i], hours_thu_close[i]) 
     h.push(hs) unless hs.nil? 
     i += 1 
    end 

    if h.count > 0 
     update_standard_hours_for("thu", h) 
    end 
    end 

    if hours_fri_open.present? && hours_fri_close.present? && hours_fri_open.count == hours_fri_close.count 
    h = Array.new 
    i = 0 
    while i < hours_fri_open.count 
     hs = build_hours_set(hours_fri_open[i], hours_fri_close[i]) 
     h.push(hs) unless hs.nil? 
     i += 1 
    end 

    if h.count > 0 
     update_standard_hours_for("fri", h) 
    end 
    end 

    if hours_sat_open.present? && hours_sat_close.present? && hours_sat_open.count == hours_sat_close.count 
    h = Array.new 
    i = 0 
    while i < hours_sat_open.count 
     hs = build_hours_set(hours_sat_open[i], hours_sat_close[i]) 
     h.push(hs) unless hs.nil? 
     i += 1 
    end 

    if h.count > 0 
     update_standard_hours_for("sat", h) 
    end 
    end 

    if hours_sun_open.present? && hours_sun_close.present? && hours_sun_open.count == hours_sun_close.count 
    h = Array.new 
    i = 0 
    while i < hours_sun_open.count 
     hs = build_hours_set(hours_sun_open[i], hours_sun_close[i]) 
     h.push(hs) unless hs.nil? 
     i += 1 
    end 

    if h.count > 0 
     update_standard_hours_for("sun", h) 
    end 
    end 
end 

def build_hours_set(open, close) 
    if open.present? && close.present? 
    {"open" => open.to_s, "close" => close.to_s} 
    else 
    nil 
    end 
end  

def update_standard_hours_for(day, hours_array) 
    if day.present? && hours_array.present? 
    self.hours = Hash.new unless hours 
    self.hours["standard"] = Hash.new unless hours["standard"] 
    self.hours["standard"][day.to_s] = hours_array 
    end 
end