Best place to store model specific constants in rails 3.1?

后端 未结 4 982
遥遥无期
遥遥无期 2021-01-31 04:54

I have a field type in a model called user which is an int in the db. The value of the int speficies the type of store it is. Example:

相关标签:
4条回答
  • 2021-01-31 05:22

    You should avoid using "type" as a model's column name unless you use Single Table Inheritance.

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

    0 讨论(0)
  • 2021-01-31 05:25

    One way you be to write an file in initializers folder or lib folder

    say app_contants.rb and in this file you can write

    MOM=1
    
    DAD=2
    
    1. Incase you write a initializer you can do

    user.type == mom

    2.If you create an lib file make it a module

     module app_constants
        mom = 1
        dad = 2
      end 
    

    and simply include this module wherever you need

    0 讨论(0)
  • 2021-01-31 05:43

    Something like:

    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
    
    0 讨论(0)
  • 2021-01-31 05:44

    Since Rails 4.1, there is support for ActiveRecord::Enum.

    There's a useful tutorial here, but in short:

    # 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'
    

    Note: To convert from your current scheme (where your database already stores numbers corresponding to values), you should use the hash syntax:

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

    I would additionally propose that you reserve 0 for the default state, but that's just one convention and not critical.

    0 讨论(0)
提交回复
热议问题