【问题标题】:Ruby on Rails: How to store form dataRuby on Rails:如何存储表单数据
【发布时间】:2009-03-08 01:36:40
【问题描述】:

我有一个将值存储为 2 个字符的状态字段。例如,阿拉巴马州保存为 AL,阿拉斯加州保存为 AK,亚利桑那州保存为 AZ 等。在 show.html.erb 中,如何显示阿拉巴马州等州的长名称,而不是只显示 AL?这可能吗,还是我应该将长名称存储在数据库中,例如 Alabama、Alaska、Arizona 等?

【问题讨论】:

    标签: ruby-on-rails ruby forms


    【解决方案1】:

    编写一个输出状态长名称的方法并在show.html.erb中调用它

    some_model.rb:

    SomeModel < ActiveRecord::Base
      STATE_CODES = {
        "AL": "Alabama", "AK": "Alaska",
        # add remaining 50
      }
      def state_human_name
        STATE_CODES[self.state]
      end
    

    show.html.erb:

    <%= record.state_human_name %>
    

    编辑:在您的数据库中存储状态的全名没有帮助——您至少在某处需要短格式,因此无论如何都需要在短格式和长格式之间添加映射。

    【讨论】:

    • 我将 STATE_CODES 存储为 "Alabama" => "AL" 而不是 "AL" => "Alabama" 如果我​​按照你的方式进行操作,我的表单字段中的选项值将显示为 AL。如何让它显示为 呢?选择标签会是什么样子?
    • select("your_object", "state", SomeModel::STATE_CODES.collect { |code, name| [name, code] })
    【解决方案2】:

    是否有理由使用 2 个字母代码(例如旧数据库)?如果不是,我会坚持通常的 ActiveRecord 习语,并有一个由 id 链接的单独“状态”表。如果您需要 2 个字母代码用于显示、打印地址标签或其他任何内容,则将“state_code”属性添加到 states 表,但不要将其用作主键。

    【讨论】:

    • 在这种情况下,在模型中使用哈希查找表并没有什么不习惯的! :) 除非我希望用户能够更新状态,否则我更喜欢 Alex 的方法,因为状态变化如此之少。删除了设置新安装时可能出错的另一件事。
    • 点了!如果数据没有改变,那为什么要把它保存在数据库中呢?但是让整个列表永久占用内存与我的直觉背道而驰,我不相信我永远不需要将其他属性附加到状态(人口、邮资或其他)的假设
    • 如果您认为您可能需要国际寻址,您应该将其放入数据库中。
    【解决方案3】:

    我将此放在评论中,但我认为它的不同之处足以值得回答。

    当您决定将州地图保存在哪里时,请考虑您是否需要将物品运送到加拿大或更远的地方。如果是这样,那么值得努力建立一个与国家表相关联的州表。

    无论如何,如果您的数据很少更改,那么将其放入数据库就不太容易出现问题,因为代码更改的频率要高得多。更频繁的更改 = 更多搞砸的机会。此外,您可以轻松地进行排序。

    class State < ActiveRecord::Base
      def self.get_states
        @@states || State.find(:all, 
                               :include => :country, 
                               :order => 'countries.name, long_name')
      end
    end
    

    【讨论】:

      【解决方案4】:

      Tilendor,我注意到如果我使用 STATE_CODES.invert,下拉菜单选择会乱序。例如,我的选项列表的前五行如下所示:

      新罕布什尔州 俄亥俄州 科罗拉多州 明尼苏达 阿拉巴马州 ...

      在我的 STATES_CODES 哈希中,我按以下顺序列出了以下内容:

      "AL" => "阿拉巴马州", "AK" => "阿拉斯加", "AZ" => "亚利桑那州", “AR” => “阿肯色州”, "CA" => "加利福尼亚", ...

      有没有办法让表单中列出的选项与 STATES_CODES 的顺序相同?也许按字母顺序排序?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 2013-12-10
        相关资源
        最近更新 更多