[Rails] enum형에서 같은 enum 이름을 여러 개 정의합니다.

8357 단어 Railsenumtech
안녕하세요.
제목에서 보듯이, enum형에서 같은 enum명을 여러 개 정의할 때 오류가 발생하지 않도록 하는 방법
공부를 했기 때문에 출력을 합니다.
그리고 지적할 점이 있다면
교수님을 얻을 수 있었으면 좋겠습니다.

전제 조건


전제는 형식표가 만들어졌고, 열에 enum 형식이 정의되었다는 것입니다.
*간략화를 위해 일부를 생략했습니다.
genre.rb
class Genre < ApplicationRecord
  belongs_to :recipe
  validates :staple_food, :main_dish, presence: true

  enum staple_food: {
    others: 0,
    rice: 1,
    bread: 2,
    noodles: 3
  }
  enum main_dish: {
    others: 0,
    meat: 1,
    fish: 2,
    egg: 3,
    soybean: 4
  }
end

같은 엔음명을 정하면 어떨까요?


enum staple_food: {
    others: 0,
    ...
    }
enum main_dish: {
    others: 0,
    ...
    }
에서 위에서 말한 바와 같이 others라는 이름이 중복되면 어떻게 될까요?
Genre.create(recipe_id: 4, staple_food: 3, main_dish: 4)
~ `raise_conflict_error': You tried to define an enum named "staple_food" on the model "Genre", but this will generate a instance method "others?", which is already defined by another enum. (ArgumentError)
그렇군요.
「"others?"나는 이런 실례적인 방법을 만들고 싶지만 이미 다른 엔움형에 의해 정의되었다.

회피 방법


레일스에서는 같은 이름으로 정의할 수 있도록 정비했다.
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 to supply a custom value:
ActiveRecord::Enum
"같은 값으로 여러 개의 enum을 정의해야 할 때:prefix 또는 :suffix를 사용할 수 있다"고 알려주세요.:prefix는 접두사의 뜻이다. 예를 들어'상담'의'상담'이 바로 이 뜻이다.:suffix는 접미사를 뜻하는데 예를 들면'그들'의'시'가 바로 이 뜻이다.
이번에 :prefix에 실시될 것이다.
genre.rb
class Genre < ApplicationRecord
  belongs_to :recipe
  validates :staple_food, :main_dish, presence: true

  enum staple_food: {
    others: 0,
    rice: 1,
    bread: 2,
    noodles: 3
+  }, _prefix: true
  enum main_dish: {
    others: 0,
    meat: 1,
    fish: 2,
    egg: 3,
    soybean: 4
+  }, _prefix: true
end
이제 데이터를 다시 만듭니다.
Genre.create(recipe_id: 4, staple_food: 3, main_dish: 4)
  TRANSACTION (0.1ms)  BEGIN
  TRANSACTION (0.4ms)  SAVEPOINT active_record_1
  Recipe Load (1.0ms)  SELECT `recipes`.* FROM `recipes` WHERE `recipes`.`id` = 4 LIMIT 1
  Genre Create (0.8ms)  INSERT INTO `genres` (`recipe_id`, `staple_food`, `main_dish`, `created_at`, `updated_at`) VALUES (4, 3, 4, ***)
  TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
그렇군요.데이터를 잘 만들 수 있게 됐어!
끝까지 읽어주셔서 감사합니다!

좋은 웹페이지 즐겨찾기