Gir*_*iri 14 ruby ruby-on-rails ruby-on-rails-4
所以subscription我的数据库中有一个表.
我想有一个state列,它将具有以下任何一个值
Valid
Invalid
Cancelled
In Trial
Non Renewing
Future
Run Code Online (Sandbox Code Playgroud)
有人可以解释如何将这些值用作rails 4中的枚举值吗?
Gir*_*iri 19
感谢:https://hackhands.com/ruby-on-enums-queries-and-rails-4-1/
声明一个枚举属性,其中值映射到数据库中的整数,但可以按名称查询.例:
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
# conversation.update! status: 0
conversation.active!
conversation.active? # => true
conversation.status # => "active"
# conversation.update! status: 1
conversation.archived!
conversation.archived? # => true
conversation.status # => "archived"
# conversation.update! status: 1
conversation.status = "archived"
# conversation.update! status: nil
conversation.status = nil
conversation.status.nil? # => true
conversation.status # => nil
Run Code Online (Sandbox Code Playgroud)
还将提供基于枚举字段的允许值的范围.通过上面的示例,它将创建一个活动和存档的范围.
您可以从数据库声明中设置默认值,例如:
create_table :conversations do |t|
t.column :status, :integer, default: 0
end
Run Code Online (Sandbox Code Playgroud)
好的做法是让第一个声明的状态成为默认状态.
最后,还可以使用Hash显式映射属性和数据库整数之间的关系:
class Conversation < ActiveRecord::Base
enum status: { active: 0, archived: 1 }
end
Run Code Online (Sandbox Code Playgroud)
请注意,使用Array时,从值到数据库整数的隐式映射是从值在数组中出现的顺序派生的.在示例中,:active映射到0,因为它是第一个元素,并且:archived映射到1.通常,第i个元素映射到数据库中的i-1.
因此,一旦将值添加到枚举数组中,就必须维护它在数组中的位置,并且只应将新值添加到数组的末尾.要删除未使用的值,应使用显式Hash语法.
在极少数情况下,您可能需要直接访问映射.映射通过具有复数属性名称的类方法公开:
Conversation.statuses # => { "active" => 0, "archived" => 1 }
Run Code Online (Sandbox Code Playgroud)
当您需要知道枚举的序数值时,请使用该类方法:
Conversation.where("status <> ?", Conversation.statuses[:archived])
Run Code Online (Sandbox Code Playgroud)
枚举属性上的条件必须使用枚举的序数值.
更多信息:http://api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html
| 归档时间: |
|
| 查看次数: |
17280 次 |
| 最近记录: |