我的数据库中有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”]。该网站每天提供多个打开/关闭条目,适用于午餐时间关闭的商家等。该属性将设置为[{“open”:“8:00 am”,“close”:“12:00 pm},在这种情况下{“开放”:“下午1:00”,“关闭”:“下午5:00}”。我想为每个条目提供两个选择框,一个用于开放时间,一个用于关闭时间。
这是我的模特。包括一些我试图弄清楚如何与我的表格联系起来的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 :(得分: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