Как сохранить ключ и значение константы в двух разных столбцах? - PullRequest
0 голосов
/ 09 января 2019

У меня есть постоянный хеш, в котором есть языки и их код ISO. Я использую эту константу в виде администратора, где администратор может выбрать язык и создать категорию. Я хотел бы сохранить название языка и его ISO в двух разных столбцах без необходимости делать это вручную.

Это моя постоянная:

LANGUAGES = {
  'fr': 'Français',
  'en': 'Anglais',
  'es': 'Espagnol',
  'de': 'Allemand',
  'pt': 'Portugais',
  'it': 'Italien',
  'ja': 'Japonais',
  'zh': 'Chinois',
  'ru': 'Russe',
  'ar': 'Arabe'
}.freeze

И выберите в моей простой_форме:

= f.input(:source_language, collection: Category::LANGUAGES.map { |iso, name| [name, iso] })

Я хотел бы сохранить ISO в столбце с именем iso, а имя в столбце с именем source_language.

Существует ли простой и элегантный способ получить название выбранного языка и сохранить его в столбце, отличном от iso?

Должен ли я сделать это в моем контроллере с сопоставлением по ISO?

1 Ответ

0 голосов
/ 09 января 2019

Существует несколько способов установить атрибут source_language , в зависимости от ваших потребностей.

  • Хотите ли вы иметь возможность устанавливать атрибуты iso и source_language независимо друг от друга? Затем вы можете захотеть установить атрибут source_language в контроллере при создании / обновлении.

    # app/controllers/categories_controller.rb
    LANGUAGES = Category::LANGUAGES.stringify_keys.freeze
    
    def create
      @category = Category.new(category_params)
      @category.source_language = LANGUAGES[@category.iso]
    
      if @category.save
        # ...
      end
    end
    
  • Первая альтернатива на основе модели - это просто создание сеттера, который будет делать это на основе атрибута iso .

    # app/models/category.rb
    def set_source_language
      languages = LANGUAGES.stringify_keys
      self.source_language = languages[iso]          
    end
    

    Затем в контроллере вы можете изменить строку @category.source_language = LANGUAGES[@category.iso] сверху на @category.set_source_language и сбросить постоянную LANGUAGES контроллера.

  • Вы могли бы объединить вышеупомянутое решение с переопределением iso атрибута setter.

    # app/models/category.rb
    def iso=(iso)
      super
      set_source_language
    end
    

    В этом случае вы можете полностью удалить строку @category.set_source_language из вашего контроллера. Помните, что source_language не должно быть разрешено внутри метода category_params .

    Имейте в виду, что это может иногда давать "неожиданные" результаты. Если вы установите iso , а затем source_language , вы можете установить их отдельно друг от друга. При первой установке source_language , за которым следует iso , значение source_language перезаписывается одним хешем.

  • Другим вариантом является использование обратного вызова модели для проверки правильности установки source_language .

    # app/models/category.rb
    before_save :set_source_language
    

    Это обеспечит правильную установку source_language перед сохранением в базу данных. Однако это также может привести к «неожиданным» результатам. Вы должны иметь в виду, что перед сохранением этот атрибут не установлен и не может быть использован (если вы не вызовете Category # set_source_language вручную). После изменения атрибута iso source_language изменяется не сразу, сначала необходимо вызвать Category # set_source_language или сохранить экземпляр, чтобы установить новый source_language .

    Вы можете использовать это вместе с вышеприведенным пунктом для создания более связного опыта. При использовании этого решения вы также можете удалить строку @category.set_source_language с контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...