代码之家  ›  专栏  ›  技术社区  ›  BvuRVKyUVlViVIc7

最佳实践:应该对静态数据使用ar模型还是全局哈希?

  •  13
  • BvuRVKyUVlViVIc7  · 技术社区  · 17 年前

    我在想一个社交网站。我的用户模型应该有一个属性“eyecolor”,可以在带有选择框/下拉列表的视图页上设置该属性。

    我的问题: ->我应该建立AR模型还是应该对数据使用全局哈希/常量? 是否有“静态模型”的最佳实践?

    如果没有AR模型,我如何将以下内容与关系联系起来:

    u = User.first 
    u.eyecolor 
    ==> 1 (not the eyecolor-string!)
    

    我需要的是眼彩线:

    u = User.first 
    u.eyecolor 
    ==> "brown"
    

    谢谢, 抱歉我的英语不好!

    4 回复  |  直到 17 年前
        1
  •  8
  •   berlin.ab    16 年前

    您可以创建一个模型来处理您的眼睛颜色逻辑:

    class EyeColor
       COLORS = ['blue','brown','hazel']
    
       attr_accessor :color
    
       # Some logic methods...
       def is_brown?
         self.color == 'brown'
       end
    
    end
    

    注意:这个模型不是一个活动的记录模型,但是它确实创建了一个抽象的您试图建模的真实世界对象。

    编辑:我也喜欢这种方法,而不是全局散列,因为它让它在eyecolor中组织静态定义,而不是在程序中浮动,这使得它清楚地知道这个定义在哪里。

    <%= select :user, :eye_color, EyeColor::COLORS %>
    

    编辑:在谓词方法中添加问号。

        2
  •  5
  •   Matt Darby    17 年前

    你想要的是一个常数。我把它们放在config/initials/constants.rb中的一个文件中;这样它们就都在同一个位置。

    EyeColors = %w{Blue Brown Hazel Green}
    

    在你的表格中,只要做:

    <%= f.select :eye_color, EyeColors %>
    
        3
  •  4
  •   Sarah Mei    17 年前

    如果你有一些数据,你应该把它放到数据库里。这并不意味着每次使用它时都必须加载它:

    class EyeColor < ActiveRecord::Base
      has_many :users
    
      def self.allowed_eye_colors
        @@eye_colors ||= AllowedEyeColor.find(:all)
      end
    end
    

    你访问这个的方式 EyeColor.allowed_eye_colors . 它是第一次使用时加载的,然后缓存在类变量中。

        4
  •  0
  •   lulalala    13 年前

    你可能想登记 constant_cache . 将此信息存储在数据库中,但是缓存它可以让您添加/删除常量(在数据库中),而不必更改实际代码。