我的数据库中有一个 subscription
表。
我想要添加一个 state
列,它将具有以下任一值之一
Valid
Invalid
Cancelled
In Trial
Non Renewing
Future
有人能解释一下如何在Rails 4中将这些值用作枚举值吗?
我的数据库中有一个 subscription
表。
我想要添加一个 state
列,它将具有以下任一值之一
Valid
Invalid
Cancelled
In Trial
Non Renewing
Future
有人能解释一下如何在Rails 4中将这些值用作枚举值吗?
致谢: 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
create_table :conversations do |t|
t.column :status, :integer, default: 0
end
最佳实践是让第一个声明的状态成为默认值。
最后,还可以使用哈希显式地映射属性与数据库整数之间的关系:
class Conversation < ActiveRecord::Base
enum status: { active: 0, archived: 1 }
end
Conversation.statuses # => { "active" => 0, "archived" => 1 }
当你需要知道枚举的序数值时,请使用该类方法:
Conversation.where("status <> ?", Conversation.statuses[:archived])
枚举属性的条件查询必须使用枚举的序号值。
更多信息请参考:http://api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html
class Article
include Workflow
workflow do
state :new do
event :submit, :transitions_to => :awaiting_review
end
state :awaiting_review do
event :review, :transitions_to => :being_reviewed
end
state :being_reviewed do
event :accept, :transitions_to => :accepted
event :reject, :transitions_to => :rejected
end
state :accepted
state :rejected
end
end
之后:
article = Article.new
article.accepted? # => false
article.new? # => true
Create a states
table in your database with these string values populated along with a unique ID, e.g.
states
id | name
---+--------------
1 | Valid
2 | Invalid
3 | Cancelled
4 | In Trial
5 | Non Renewing
6 | Future
Use a standard foreign-key association in your subscription
table referencing an entry from states
.
In your models, create a State
class with constants matching the IDs, e.g.:
class State < ActiveRecord::Base
VALID = 1
INVALID = 2
# etc.
end
subscriptions
。Subscription.where( state_id: State::VALID )