Rails / Использование наследования одной таблицы со значениями неанглийского типа

#ruby-on-rails #activerecord #ruby-on-rails-4 #localization #sti

#ruby-on-rails #activerecord #ruby-on-rails-4 #локализация #sti

Вопрос:

Я рассматриваю возможность использования наследования одной таблицы для моей модели контактов, чтобы реализовать различное поведение для разных типов контактов. Насколько я понимаю, Rails определяет, какую модель.rb, контроллеры, маршруты и так далее использовать, просматривая значение столбца типа в contact.rb.

Я намерен использовать единую форму создания для контактов, где пользователи могут выбирать тип контакта в поле выбора. Но как это будет работать, если язык моего приложения по умолчанию — немецкий? Таким образом, вместо выбора типа контакта, такого как «customer», пользователи будут выбирать «Kunde» — однако, конечно, я не хочу путать свои имена файлов и хотел бы использовать customer.rb, customers_controller.rb, customer_path и так далее.

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

Я что-то упускаю или это просто не стоит усилий, если ваше приложение не на английском языке?

Комментарии:

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

2. Хотя это хорошее предложение (использовать I18n) в целом, оно на самом деле не применимо к данному случаю. Вы не переводите слова в шаблонах для других слов в шаблонах — хороший вариант использования для I18n. Эта проблема существует с немецким языком в уравнении или без него.

3. @Sharagoz Конечно, я намерен сохранить свой код на английском языке по причинам, которые вы уже упомянули. Однако я думаю, что вопрос, который я задал, становится важным, когда неанглийский пользовательский ввод используется для определения структуры модели / отношений, как в этом случае, когда значением столбца типа, скорее всего, будет неанглийский термин. И теперь мне интересно, как сообщить Rails, что тип «Kunde» принадлежит модели customer.

4. Фактические названия моделей хранятся в type столбце, который rails использует для отслеживания STI. Если названия моделей на английском языке, то эти значения также будут английскими.

5. Вы можете перевести названия моделей для моделей STI точно так же, как и для любой другой модели. Если вы переведете «Customer» в «Kunde» с помощью I18n, то вызов Customer.model_name.human вернет «Kunde». Я предлагаю вам попробовать свои силы в его реализации, а затем задавать вопросы по SO, когда вы действительно столкнетесь с проблемами. Это может быть проще, чем вы думаете.

Ответ №1:

Мне кажется, что вам нужен некоторый уровень перевода из элементов в select в виды (types) контактов в базе данных. Я бы не предлагал разрешать пользователю выбирать буквальное имя класса из выпадающего списка, а вместо этого использовать сопоставление выбранного значения с именем класса. Это сопоставление может существовать где угодно, что имеет смысл, но один из способов — иметь его в контроллере

 class ContactsController < ApplicationController
  before_filter :translate, only: :create

  def create
    @contact = @translated.create(params[:contact].permit(:name, :starting_date))

    respond_with @contact
  end

  def translate
    mapping = {'Kunde', => Customer, 'Besteller' => Purchaser}

    render_error unless (@translated = mapping[params[:type]]).present?
  end
end
  

Здесь мы поддерживаем два возможных перевода с Kunde на Customer и Besteller на Buyer, в противном случае это ошибка

Комментарии:

1. Я пытаюсь следовать вашим предложениям, но у меня есть несколько вопросов: какое значение сохраняется в столбце type? Я предполагаю, что английский термин, в то время как немецкий используется только в поле выбора, верно? Если да, то не является ли это а) очень похожим на стратегию использования разных атрибутов name / value для параметров выбора и б) не придется ли мне иметь дело с некоторой формой translation / i18n во всех представлениях, которые отображают столбец type? Это кажется довольно сложным, я бы предпочел иметь «Kunde» в качестве фактического значения в столбце и все же сообщить Rails, чтобы использовать модель customer. Извините, если я вас неправильно понял — я новичок в Rails.

2. Это будет не английский термин и не немецкий термин, а имя класса элемента, в данном случае это будет Customer или Purchaser . Внутренне rails примет значение в столбце type и запустит constantize метод для него и вернет этот класс в качестве результата.