1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails モデル間でenumを一部だけ共有する

1
Last updated at Posted at 2016-05-31

やりたいこと

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値をexceptsliceで削り取り出すようにします。

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
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?