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

时间:2011-11-06 10:08:33

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-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这个解决方案。

4 个答案:

答案 0 :(得分:40)

类似的东西:

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

答案 1 :(得分:9)

自Rails 4.1以来,支持ActiveRecord::Enum

这是一本有用的教程here,但简而言之:

# 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,但这只是一个约定而非关键。

答案 2 :(得分:3)

你应该避免使用&#34;输入&#34;作为模型的列名,除非您使用单表继承。

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

答案 3 :(得分:1)

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

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

MOM=1

DAD=2
  1. 请你写一个初始化器 你可以做到
  2.   

    user.type == mom

    2.如果您创建了一个lib文件  把它变成一个模块

     module app_constants
        mom = 1
        dad = 2
      end 
    

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