Rails5에서 enum을 사용할 때는 _prefix (접두사) _suffix (접미사)를 사용합시다.

13667 단어 enumActiveRecordRails5

이 기사에서 전하고 싶은 것



Rails5에서 ActiveRecord::Enum를 정의 할 때 _prefix, _suffix라는 무기가 있다는 것을 알고 싶습니다.

핵심 부분만 보고 싶은 분은 단축키

2019.09.12
문장의 「입니다・합니다」조를 통일.

2019.06.01
예제로 사용되는 테이블에 대한 설명 추가

Rails 버전



bash
 ./bin/rails --version
Rails 5.2.0

_prefix, _suffix 정의



You can use the :_prefix or :_suffix options when you need to define multiple enums with same values. If the passed value is true, the methods are prefixed/suffixed with the name of the enum. It is also possible a custom value:

동일한 값을 가진 여러 enum을 정의해야 하는 경우 _prefix 또는 :_suffix 옵션을 사용할 수 있습니다. 건네받은 값이 true 의 경우, 메소드에는 enum 의 이름의 접두사/접미사가 붙습니다. 사용자 정의 값을 지정할 수도 있습니다.

하지만 이번 테마. 바로 같은 값을 가지는 복수의 enum를 정의해 가자.
그리고 그 전에, 자주 있는 enum 정의와 그것이 좋지 않은 이유를 깊이 파고 가 이해도를 깊게 하자.

정의하고 싶은 내용


Conversation (대화 : 대화, 대화) 테이블을 예로 들어 두 개의 enum를 정의하고 싶습니다.
- status (상태. 0=유효, 10=아카이브)
- comments_status (코멘트 상태. 0=사용, 10=사용 안 함)

틀린 정의 1



/app/models/conversation.rb
class Conversation < ActiveRecord::Base
  enum status: { active: 0, archived: 10 }
  enum comments_status: { active: 0  inactive: 10 }
end

결과
irb(main):004:0> c = Conversation.find(1)
ArgumentError (You tried to define an enum named "comments_status" on the model "Conversation", but this will generate a instance method "active?", which is already defined by another enum.)

오류. 나중에 추가한 comments_statusactive 중복된 때문에.

틀린 정의 2



/app/models/conversation.rb
class Conversation < ActiveRecord::Base
  enum status: { active: 0, archived: 10 }
  enum comments_status: { comments_status_active: 0,  comments_status_inactive: 10 }
end

실수 1 오류를 피하기 위해 나중에 추가 comment_status의 값을 다시 씁니다. 확실히 에러는 되지 않지만, 결과적으로 알고 괴로워졌다. 다음과 같이 비교할 때 기분 나빠질 것 같다.
conversation.comments_status_active? # 分かりやすい
conversation.active? # 「status.active か comments_status.active」 のどちらか分かり辛い。

틀린 정의 3



/app/models/conversation.rb
class Conversation < ActiveRecord::Base
  enum status: { status_active: 0, status_archived: 10 }
  enum comments_status: { comments_status_active: 0,  comments_status_inactive: 10 }
end

이번에는 통일성을 갖기 위해 각각 접두사를 붙이게 했다.
이것으로 중복 에러도 회피, 통일성이 있어 기분 나쁨도 회피와 문제 해소.
conversation.comments_status_active? # 分かりやすい
conversation.status_active? # 分かりやすい

확실히 이것으로 「중복도 하지 않는다」, 「혼란도 하기 어렵다」라고 문제 없을 것 같지만, _prefix(접두사), _suffix(접미사) 기능을 활용할 수 없다고 하는 점에서 좋은 설정이라고는 할 수 없을 것이다.

_prefix(접두사) _suffix(접미사) 사용



여기에서 책 테마의 중추.

_prefix(접두사)



/app/models/conversation.rb
class Conversation < ActiveRecord::Base
  enum status: [:active, :archived], _prefix: true
  enum comments_status: [:active, :inactive], _prefix: true
end

각 enum 행의 뒤에 _prefix: true를 부여.:activeenum statusenum comments_status 모두에 존재하는 값이지만 _prefix를 부여하면 중복 오류가 발생하지 않습니다.
_prefix 는 접두사가 되므로 다음과 같은 조작이 가능하게 된다.
# 頭に status_ を付与
> conversation.status_archived! # 更新(UPDATE)
> conversation.status_archived? # true
> conversation.status_active? # false

# 頭に comments_status_ を付与
> conversation.comments_status_active! # 更新(UPDATE)
> conversation.comments_status_active? # true
> conversation.comments_status_inactive? # false

# 接頭辞なしはエラーになる
> conversation.active?
Traceback (most recent call last):
        1: from (irb):11
NoMethodError (undefined method `active?' for #<Conversation:0x00007ff78097c910>)

_suffix(접미사)



/app/models/conversation.rb
class Conversation < ActiveRecord::Base
  enum status: [:active, :archived], _suffix: true
  enum comments_status: [:active, :inactive], _suffix: true
end

다음 _suffix (접미사). 다음과 같은 조작이 가능해진다.
# お尻に _status を付与
> conversation.archived_status! # 更新(UPDATE)
> conversation.archived_status? # true
> conversation.active_status? # false

# お尻に _comments_status を付与
> conversation.active_comments_status! # 更新(UPDATE)
> conversation.active_comments_status? # true
> conversation.inactive_comments_status? # false

# 接尾辞なしはエラーになる
> conversation.active?
Traceback (most recent call last):
        1: from (irb):11
NoMethodError (undefined method `active?' for #<Conversation:0x00007ff78097c910>)

맞춤 값



/app/models/conversation.rb
class Conversation < ActiveRecord::Base
  enum status: [:active, :archived], _prefix: true
  enum comments_status: [:active, :inactive], _prefix: :comments
end
comments_status 측만 _prefix: :comments 및 사용자 지정 값을 설정합니다.
이렇게 하면 접두사comments_status_를 붙이기보다는 comments_만으로 좋기 때문에 문자수가 줄어들어 의미도 이해하기 쉽다는 이점이 있다.
# 頭に comments_ を付与
> conversation.comments_active! # 更新(UPDATE)
> conversation.comments_active? # true
> conversation.comments_inactive? # false

요약



위의 실수 1, 2, 3은 실제로 내가 만난 내용입니다. 해보고 싶다.

좋은 controller는 좋은 model가 만든다. 좋은 model 은 좋은 enum 가 만든다

참고 링크



Ruby on Rails 5.1.6 > ActiveRecord::Enum
Change the World!> ActiveRecord::Enum 사용 및 중복 오류 방지
Qiita > Rails5에서 enum 정의한 열의 원래 값을 가져옵니다.

좋은 웹페이지 즐겨찾기