Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

ActiveRecord 열거형으로 쉽고 읽기 쉬운 속성 만들기

"보류 중", "승인됨" 또는 "표시됨"일 수 있는 질문을 상상해 보십시오. 또는 "집", "사무실", "휴대전화" 또는 "팩스"인 전화번호(1982년인 경우)

일부 모델은 이러한 종류의 데이터를 요구합니다. 몇 가지 다른 값 중 하나만 가질 수 있는 속성입니다. 그리고 그 값 세트는 거의 변경되지 않습니다.

평범한 루비라면 그냥 심볼만 사용했을 상황입니다.

PhoneNumberType 또는 QuestionStatus 모델과 belongs_to를 생성할 수 있습니다. 이러한 가치를 유지하기 위한 관계이지만 가치가 없어 보입니다. yaml 파일에 채울 수 있지만 이제 개체가 무엇을 할 수 있는지 파악하려면 완전히 다른 위치를 살펴봐야 합니다.

4.1에서 Rails는 ActiveRecord 열거형을 사용하여 이 문제를 해결하기 위해 노력했습니다.

모델의 몇 가지 값

ActiveRecord 열거형은 매우 쉽습니다. 모델에 integer를 제공합니다. 열:

bin/rails g model phone number:string phone_number_type:integer

속성이 취할 수 있는 값 나열:

앱/모델/phone.rb
class Phone < ActiveRecord::Base
  enum phone_number_type: [:home, :office, :mobile, :fax]
end

이제 숫자 대신 문자열을 처리할 수 있습니다.

대신:

irb(main):001:0> Phone.first.phone_number_type
=> 3

다음 항목이 표시됩니다.

irb(main):002:0> Phone.first.phone_number_type
=> "fax"

변경할 수 있습니다. 문자열이나 정수를 사용하는 속성:

irb(main):003:0> phone.phone_number_type = 1; phone.phone_number_type
=> "office"
irb(main):004:0> phone.phone_number_type = "mobile"; phone.phone_number_type
=> "mobile"

또는 쾅 방법을 사용하는 경우:

irb(main):005:0> phone.office!
=> true
irb(main):006:0> phone.phone_number_type
=> "office"

속성에 특정 값이 있는지 묻는 메서드가 표시됩니다.

irb(main):007:0> phone.office?
=> true

모두를 찾을 수 있습니다. 찾고 있는 값을 가진 개체:

irb(main):008:0> Phone.office
  Phone Load (0.3ms)  SELECT "phones".* FROM "phones" WHERE "phones"."phone_number_type" = ?  [["phone_number_type", 1]]

사용할 수 있는 모든 다른 값과 연결된 번호를 보려면 phone_number_types를 사용하세요. 클래스 메서드:

irb(main):009:0> Phone.phone_number_types
=> {"home"=>0, "office"=>1, "mobile"=>2, "fax"=>3}

이를 통해 HTML 양식에 쉽게 넣을 수 있습니다.

app/views/phones/_form.html.erb
<div class="field">
  <%= f.label :phone_number_type %><br>
  <%= f.select :phone_number_type, Phone.phone_number_types.keys %>
</div>

ActiveRecord 열거형으로 쉽고 읽기 쉬운 속성 만들기

주의해야 할 몇 가지 사항

열거형에도 문제가 없는 것은 아닙니다. 나중에 문제가 발생하지 않으려면 몇 가지 사항을 염두에 두어야 합니다.

열거형을 정의할 때 순서가 중요합니다. 따라서 코드로 돌아가서 해당 값이 실제로 알파벳 순서여야 한다고 결정하면:

앱/모델/phone.rb
class Phone < ActiveRecord::Base
  enum phone_number_type: [:fax, :home, :mobile, :office]
end

귀하의 휴대전화에는 더 이상 올바른 유형이 없습니다. enum이라고 말하면 이 문제를 해결할 수 있습니다. 어떤 숫자가 어떤 값과 연결되는지:

앱/모델/phone.rb
class Phone < ActiveRecord::Base
  enum phone_number_type: {fax: 3, home: 0, mobile: 2, office: 1}
end

하지만 실제로 가장 좋은 방법은 순서를 일관되게 유지하는 것입니다.

더 큰 문제는 Rails 세계 밖에서 무엇을 해야 하는지입니다. Rails는 이러한 열거형 값을 문자열로 간주하지만 데이터베이스 내부의 숫자일 뿐입니다. 따라서 원시 데이터를 보는 누군가는 아니요 그 숫자가 무엇을 의미하는지 생각해 보세요. 이것은 또한 해당 데이터베이스를 읽는 모든 앱이 해당 열거형 매핑을 알아야 함을 의미합니다.

다른 사람들이 볼 필요가 있다면 열거형 매핑을 데이터베이스나 yaml 파일에 덤프할 수 있습니다. 하지만 DRY가 아닙니다. 이제 enum을 두 곳에서 정의하고 있기 때문입니다. 그리고 그 정도까지 간다면 처음에는 피하고 있던 일을 하는 것이 더 나을 수 있습니다. 완전히 별도의 모델과 연결을 만들어 전화가 belong_to할 수 있도록 전화번호 유형.

하지만 단순하게 유지한다면 열거형을 시작하는 것이 좋습니다.

추신 놓쳤다면 Rails 연습 7월 6일 월요일에 출시되는 Ruby Book Bundle에 포함됩니다. 할인된 가격으로 5권의 다른 Ruby 책을 구입하세요!