最佳实践:我应该使用AR模型还是全局Hash来获取静态数据?

时间:2009-03-05 14:33:26

标签: ruby-on-rails

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

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

如何在没有AR模型的情况下将关注关联起来:

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

我需要的是eyecolor-string:

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

谢谢, 对不起,我的英语不好!

4 个答案:

答案 0 :(得分:8)

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

class EyeColor
   COLORS = ['blue','brown','hazel']

   attr_accessor :color

   # Some logic methods...
   def is_brown?
     self.color == 'brown'
   end

end

注意:此模型不是Active Record模型,但它确实创建了一个抽象的实际对象。

编辑:我也喜欢这种方法而不是全局哈希,因为它让它在EyeColor中组织你的静态定义,而不是在你的程序中浮动,这清楚地说明了这个定义的位置。

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

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

答案 1 :(得分:5)

你想要的是一个常数。我把它们放在config / initializers / constants.rb中的一个文件中;那样他们都在同一个地方。

EyeColors = %w{Blue Brown Hazel Green}

在你的表格中,只需:

<%= f.select :eye_color, EyeColors %>

答案 2 :(得分:4)

如果您有一些数据,则应将其放入数据库中。这并不意味着每次使用时都必须加载它:

class EyeColor < ActiveRecord::Base
  has_many :users

  def self.allowed_eye_colors
    @@eye_colors ||= AllowedEyeColor.find(:all)
  end
end

您可以EyeColor.allowed_eye_colors来访问它。它在您第一次使用时加载,然后缓存在类变量中。

答案 3 :(得分:0)

您可能需要查看constant_cache。将此信息存储在数据库中,但如果将其缓存,则可以在不更改实际代码的情况下添加/删除常量(在数据库中)。

相关问题