Удаление одного перевода из модели в проекте Rails с помощью Mobility

Я переношу проект Rails из Globalize в Mobility. С Globalize у меня был доступ к текущему переводу через метод translation:

feature.translation

Я использовал это в основном при управлении переводами для модели, чтобы удалить конкретный перевод:

feature.translation.destroy

С Globalize для каждого объекта я получаю список переводов и создаю для каждого кнопку удаления:

<%= link_to 'x', admin_feature_path(list_item, translation_locale: l), method: :delete, data: { confirm: %(Are you sure you want to delete this #{humanize_locale l} translation? This cannot be undone.) } %>

Я использую локаль, переданную по ссылке, чтобы удалить соответствующий перевод:

Mobility.with_locale(translation_locale) do
  @feature.tranlsation.destroy
end

Есть ли простой способ удалить один перевод из модели с несколькими переводами?


person partydrone    schedule 15.02.2018    source источник
comment
Почему вы не обновляете поле hstore/json напрямую в БД?   -  person Martin Zinovsky    schedule 15.02.2018


Ответы (1)


На самом деле в мобильности нет ничего особенного. У вас есть модель с ассоциацией translations, каждая translation имеет locale.

Итак, чтобы уничтожить перевод, вы можете просто найти его и уничтожить:

translation = feature.translations.find { |t| t.locale == Mobility.locale.to_s }
translation.destroy

Если вам нужен метод, подобный Globalize, просто добавьте его в свою модель:

def translation
  translations.find { |t| t.locale == Mobility.locale.to_s }
end

Вот и все!

person Chris Salzberg    schedule 16.02.2018
comment
translations.find { |t| t.locale == Mobility.locale } возвращает nil. Поскольку translations возвращает объект DownloadType::Translation::ActiveRecord_Associations_CollectionProxy, похоже, это работает: translations.where(locale: Mobility.locale).first - person partydrone; 18.02.2018
comment
Извините, там отсутствовал to_s, сейчас исправлено (должно быть Mobility.locale.to_s). Вы не должны использовать where, потому что это не сработает, если не будут сохранены все переводы. - person Chris Salzberg; 18.02.2018