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

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

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

如何在没有AR模型的情况下关联以下关系:

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

我需要的是eyecolor-string:

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

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

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

 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 %> 

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

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

 EyeColors = %w{Blue Brown Hazel Green} 

在您的表单中只需:

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

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

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

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

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