Rails enum에 대한 포괄적인 가이드



열거형이란 무엇입니까?



Enum은 각각 다른 값을 갖는 명명된 요소로 구성된 데이터 유형인 enumeration의 약자입니다. 열거자 이름은 일반적으로 언어에서 상수로 작동하는 식별자입니다.
ActiveRecord::Enum는 Rails 4.1에서 도입되었습니다. 열거형 특성을 선언하면 문자열 및 기호와 같은 값을 데이터베이스의 정수에 매핑할 수 있으며 이름으로 쿼리할 수 있습니다. 이것은 정수의 속도와 효율성, 문자열이나 기호의 유연성을 가지고 있음을 의미합니다.


언제 enum 을 사용할 수 있습니까?



필드의 값이 상수인 경우. Book 모델을 만들고 필드가 genre 이라고 가정해 보겠습니다. 장르 이름을 다음과 같은 정수로 매핑할 수 있습니다. { fantasy: 0, adventure: 1, mystery: 2, romance: 3 }

열거형을 구현하는 방법?


Book 모델 예제를 계속 사용하겠습니다.

1. 도서에 장르 필드를 정수로 추가




class AddGenreToBooks < ActiveRecord::Migration[6.0]
  def change
    add_column :books, :genre, :integer
  end
end


2. 책 모델에 장르 추가



열거형을 선언하는 방법에는 두 가지가 있습니다.
  • 배열 사용

  • # app/models/book.rb
    class Book < ActiveRecord::Base
      enum genre: [ :fantasy, :adventure, :mystery, :romance ]
    end
    


    ...또는 더 간단하게

    # app/models/book.rb
    class Book < ActiveRecord::Base
      enum genre: %i(fantasy adventure mystery romance)
    end
    

    %i()(백분율 문자열)의 구문은 내 블로그 게시물을 참조하십시오.
  • 해시 사용

  • # app/models/book.rb
    class Book < ActiveRecord::Base
      enum genre: { fantasy: 0, adventure: 1, mystery: 2, romance: 3 }
    end
    


    값에 특정 숫자를 할당하려는 경우 해시를 사용하는 것이 좋습니다.


    어떻게 작동하는지 봅시다.



    쿼리 장르




    # console
    2.6.1 :001 > Book.genres # Check how the genre enum is defined
    => {"fantasy"=>0, "adventure"=>1, "mystery"=>2, "romance"=>3}
    2.6.1 :002 > Book.genres[:adventure] # Check the identifier number of "adventure"
    => 1
    2.6.1 :003 > Book.genres[:history] # If the genre doesn't exist, it returns nil
    => nil
    


    인스턴스 생성 및 업데이트




    # console
    2.6.1 :001 > book = Book.create(title: "The Lord of the Rings", genre: 0)
    => #<Book id: 1, title: "The Lord of the Rings", genre: "fantasy", created_at: "2020-12-03 03:27:05", updated_at: "2020-12-03 03:27:05">
    2.6.1 :002 > book.genre # Check the genre
    => "fantasy"
    
    # The following doesn't work when you use strings with spaces for enum.
    2.6.1 :003 > book.adventure? # Check if the genre is "adventure"
    => false
    2.6.1 :004 > book.adventure! # Update the genre
    => true
    2.6.1 :005 > book.genre
    => "adventure"
    


    보기의 열거형



    열거형의 멋진 점은 컨트롤러와 보기에서 기호나 문자열로 취급할 수 있고 실제로 데이터베이스의 정수인지 걱정할 필요가 없다는 것입니다.

    # app/controllers/books_controller.rb
    def index
      @books = Book.all
    end
    
    def new
      @book = Book.new
    end
    



    # app/views/books/index.html.erb
    <% @books.each do |book| %>
      <div><%= book.title %></div>
      <div><%= book.genre %></div>
    <% end %>
    



    # app/views/books/new.html.erb
    <%= form_for @book do |f| %>
      <%= f.select :genre, Book.genres.keys %>
      <%= f.submit %>
    <% end %>
    


    ActiveRecord::Enum는 메모리에 정수이므로 데이터를 저장하는 더 저렴한 방법이지만 알고 있는 모든 ActiveRecord 메서드를 사용할 수 있습니다.

    좋은 웹페이지 즐겨찾기