当前位置:  开发笔记 > 后端 > 正文

使用Rails时在Ruby中处理常量的最佳方法是什么?

如何解决《使用Rails时在Ruby中处理常量的最佳方法是什么?》经验,为你挑选了5个好方法。

我有一些常量代表我的一个模型字段中的有效选项.在Ruby中处理这些常量的最佳方法是什么?



1> Codebeef..:

您可以为此目的使用数组或哈希(在environment.rb中):

OPTIONS = ['one', 'two', 'three']
OPTIONS = {:one => 1, :two => 2, :three => 3}

或者是枚举类,它允许您枚举常量以及用于关联它们的键:

class Enumeration
  def Enumeration.add_item(key,value)
    @hash ||= {}
    @hash[key]=value
  end

  def Enumeration.const_missing(key)
    @hash[key]
  end   

  def Enumeration.each
    @hash.each {|key,value| yield(key,value)}
  end

  def Enumeration.values
    @hash.values || []
  end

  def Enumeration.keys
    @hash.keys || []
  end

  def Enumeration.[](key)
    @hash[key]
  end
end

你可以从中得到:

class Values < Enumeration
  self.add_item(:RED, '#f00')
  self.add_item(:GREEN, '#0f0')
  self.add_item(:BLUE, '#00f')
end

并使用这样的:

Values::RED    => '#f00'
Values::GREEN  => '#0f0'
Values::BLUE   => '#00f'

Values.keys    => [:RED, :GREEN, :BLUE]
Values.values  => ['#f00', '#0f0', '#00f']


我决定采用这种解决方案.我不得不说,它确实是我想要的,并与ActiveRecord很好地配合.谢谢!:d

2> Micah..:

我把它们直接放在模型类中,如下所示:

class MyClass < ActiveRecord::Base
  ACTIVE_STATUS = "active"
  INACTIVE_STATUS = "inactive"
  PENDING_STATUS = "pending"
end

然后,当使用来自另一个类的模型时,我引用了常量

@model.status = MyClass::ACTIVE_STATUS
@model.save


这是一种不是类的方法.需要使用"class"而不是"def".

3> 小智..:

如果它是驱动模型行为,那么常量应该是模型的一部分:

class Model < ActiveRecord::Base
  ONE = 1
  TWO = 2

  validates_inclusion_of :value, :in => [ONE, TWO]
end

这将允许您使用内置的Rails功能:

>> m=Model.new
=> #
>> m.valid?
=> false
>> m.value = 1
=> 1
>> m.valid?
=> true

或者,如果您的数据库支持枚举,那么您可以使用Enum Column插件之类的东西.



4> Simone Carle..:

Rails 4.1增加了对ActiveRecord枚举的支持.

声明一个枚举属性,其中值映射到数据库中的整数,但可以按名称查询.

class Conversation < ActiveRecord::Base
  enum status: [ :active, :archived ]
end

conversation.archived!
conversation.active? # => false
conversation.status  # => "archived"

Conversation.archived # => Relation for all archived Conversations

有关详细的说明,请参阅其文档.



5> Dema..:

您也可以在模型中使用它,如下所示:

class MyModel

  SOME_ATTR_OPTIONS = {
    :first_option => 1,
    :second_option => 2, 
    :third_option => 3
  }
end

并像这样使用它:


if x == MyModel::SOME_ATTR_OPTIONS[:first_option]
  do this
end

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有