やりたいこと
PullRequestはIssueを継承しており、同じenumを扱いたいが、PullRequestでは扱うenumを一部に制限したい。
下記のようにかけば一応揃いはするのだが、これでは新たなにstatusが増えたときに値がずれてしまう。
isssue.rb
class Issue < ActiveRecord::Base
enum status: %i(open closed pending deleted)
end
pull_request.rb
class PullRequest < Issue
enum status: %i(open closed)
end
そこで、enumの値を共有しつもも、一部分だけに制限する方法を紹介します。
enumの値をハッシュで取得して必要な部分だけ取り出す
方法としては、共有したいenumの値をハッシュとして取得し、取り出す部分のenum値をexceptやsliceで削り取り出すようにします。
isssue.rb
class Issue < ActiveRecord::Base
enum status: Status.issue
end
pull_request.rb
class PullRequest < Issue
enum status: Issue.statuses.slice(:open, :closed)
end
すると、PullRequestとIssueでenumの値を共有しつつも、有効なenumを制限することができます。
irb(main):001:0> Issue.statuses
=> {"open"=>0, "closed"=>1, "pending"=>2, "deleted"=>3}
irb(main):002:0> PullRequest.statuses
=> {"open"=>0, "closed"=>1}
確認のため、この状態でPullRequestにない'deleted'を指定するとArgumentErrorの例外が発生するようになっております。
irb(main):003:0> PullRequest.create(status: 'deleted')
ArgumentError: 'deleted' is not a valid status