возврат к другому столбцу в globalize

В globalize / globalize я хочу вернуться к другому столбцу. источник образца.

class CreatePosts < ActiveRecord::Migration
  def up
    create_table :posts do |t|
      t.string :foo, null: false

      t.timestamps null: false
    end
    Post.create_translation_table! hoge: :string
  end
end

class Post < ActiveRecord::Base
  # this not work. but I want to like this.
  translates :hoge, :fallbacks_for_empty_translations => :foo
end

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


person shingo.nakanishi    schedule 26.11.2015    source источник


Ответы (1)


Как указано в документации globalize, вам не нужно добавлять переводимый столбец в миграцию таблицы, а передавать его как аргумент для создания таблицы перевода.

class CreatePosts < ActiveRecord::Migration
  def up
    create_table :posts do |t|
      # no foo column specified here
      t.timestamps null: false
    end
  Post.create_translation_table! foo: :string
  end
end

class Post < ActiveRecord::Base
  translates :foo, :fallbacks_for_empty_translations => true
end

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

Если вы правильно установили

config.i18n.fallbacks = true

и установите :en в качестве языка по умолчанию, при получении значения поля foo всякий раз, когда значение, зависящее от локали, отсутствует, по умолчанию будет использоваться значение English. Например, учитывая два сообщения (post1и post2) с данными

[#<Post::Translation id: 1, post_id: 1, locale: "en", foo: 'Italy'>,
  #<Post::Translation id: 2, post_id: 1, locale: "jp", foo: 'Hetalia'>,
  #<Post::Translation id: 3, post_id: 2, locale: "en", foo: 'Finland'>,
  #<Post::Translation id: 4, post_id: 2, locale: "jp", foo: ''>]

если вы используете японский язык, вы получите

post1.foo # => 'Hetalia'
post2.foo # => 'Finland'
person Marco Sandrini    schedule 26.11.2015
comment
Спасибо. но моя система должна вернуться к другому столбцу. - person shingo.nakanishi; 26.11.2015
comment
Тогда вы уверены, что globalize - это то, что вам нужно? Если столбцы не являются просто переводами друг друга, альтернатива состоит в том, чтобы определить свои собственные сеттеры и геттеры для этих столбцов и вообще не использовать глобализацию. - person Marco Sandrini; 26.11.2015