在rails 3.1中存储模型特定常量的最佳位置?

我在名为user的模型中有一个字段类型 ,它是db中的int。 int的值指定它的存储类型。 例:

  • 0 =妈妈
  • 1 =爸爸
  • 2 =祖母
  • 等等

我有其他几个这样的领域,所以创建关联表是有点过分的。

不是在模型和控制器逻辑中的条件语句中检查那些int值,而是在rails中存在这些常量来存储这些常量。

所以我可以从我的模型和控制器中做到这一点?

if myuser.type == MOM elsif myuser.type == GRAND_MOTHER 

编辑:解决方案我最后一起去了:

在模型中:

  # constants TYPES = { :mom => 0, :dad => 1, :grandmother => 2, :grandfather => 3 } 

在逻辑上:

 if u.type == User::TYPES[:mom] 

即使它更长,我觉得当他们阅读我的代码时,对其他开发人员来说更直观。 感谢下面的Taro这个解决方案。

就像是:

 class User < ActiveRecord::Base TYPES = %w{ mom dad grandmother grandfather son } TYPES.each_with_index do |meth, index| define_method("#{meth}?") { type == index } end end u = User.new u.type = 4 u.mom? # => false u.son? # => true 

从Rails 4.1开始,支持ActiveRecord :: Enum 。

这里有一个有用的教程,但简而言之:

 # models/user.rb class User < ActiveRecord::Base enum family_role: [ :mum, :dad, :grandmother] end # logic elsewhere u = User.first u.family_role = 'mum' u.mum? # => true u.family_role # => 'mum' 

注意:要从当前方案(数据库已存储与值对应的数字)进行转换,您应该使用哈希语法:

 enum family_role: { mum: 0, dad: 1, grandmother: 2 } 

我还建议你为默认状态保留0 ,但这只是一个约定而不是关键。

除非使用单表inheritance,否则应避免使用“type”作为模型的列名。

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Single+table+inheritance

在initializers文件夹或lib文件夹中编写文件的一种方法

app_contants.rb并在这个文件中你可以写

 MOM=1 DAD=2 
  1. 如果你写一个你可以做的初始化器

user.type ==妈妈

2.如果您创建了一个lib文件,请将其作为模块

  module app_constants mom = 1 dad = 2 end 

只需将此模块包含在您需要的任何位置即可