【问题标题】:Accessing/setting nested value with a form使用表单访问/设置嵌套值
【发布时间】:2012-10-30 20:08:20
【问题描述】:

我的数据库中有 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}, {"open" : "1:00 pm", "close" : "5:00 pm}] 在这种情况下。我想为每个条目提供两个选择框,一个用于开放时间,一个用于关闭时间。

这是我的模型。包括一些我试图弄清楚如何绑定到我的表单中的 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

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 mongoid


    【解决方案1】:

    我想出了一个办法,虽然我不能 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多