Как построить несколько объектов при добавлении ассоциации?

Rails 4.2.1, Ruby 2.2.1. Отношения:

class Region < ActiveRecord::Base
  has_many :translations,      dependent: :destroy  
  has_many :custom_properties, dependent: :destroy
  has_many :languages,         through: :translations
  has_many :options,           through: :custom_properties
  accepts_nested_attributes_for :custom_properties, reject_if: :all_blank, allow_destroy: true
  accepts_nested_attributes_for :translations,      reject_if: :all_blank, allow_destroy: true
end

class CustomProperty < ActiveRecord::Base
  belongs_to :region
  has_many :options, dependent: :destroy
  has_many :custom_property_translations, dependent: :destroy
  accepts_nested_attributes_for :options, reject_if: :all_blank, allow_destroy: true
  accepts_nested_attributes_for :custom_property_translations, reject_if: :all_blank, allow_destroy: true
end

class CustomPropertyTranslation < ActiveRecord::Base
  belongs_to :custom_property
  belongs_to :language
end


class Option < ActiveRecord::Base
  belongs_to :custom_property
  has_many :option_translations, dependent: :destroy
  accepts_nested_attributes_for :option_translations, reject_if: :all_blank, allow_destroy: true
end

class OptionTranslation < ActiveRecord::Base
  belongs_to :option
  belongs_to :language
end

В форме региона я использую cocoon для вложенных полей.

  = f.simple_fields_for :custom_properties do |custom_property|
    = render 'custom_property_fields', f: custom_property
  .links
    = link_to_add_association 'add property', f, :custom_properties

И вложенная форма для CustomPropertyTranslation а также OptionTranslation,

= f.simple_fields_for :custom_property_translations do |custom_property_translation|
      = render 'custom_property_translation_fields', f: custom_property_translation
  .links
    = link_to_add_association t('.add_translation'), f, :custom_property_translations

Я не хочу автоматически строить несколько CustomPropertyTranslation а также OptionTranslation в зависимости от того, сколько языков в регионе.

Я пытался использовать after_initialize обратный вызов для создания необходимых ассоциаций, но он работал только для существующих пользовательских свойств. Как создать несколько ассоциаций одновременно add translation?

1 ответ

Решение

Вы можете использовать count ключ в html_options из link_to_add_association помощник, чтобы определить, сколько новых объектов вы хотите создать

= f.simple_fields_for :custom_property_translations do |custom_property_translation|
      = render 'custom_property_translation_fields', f: custom_property_translation
  .links
    = link_to_add_association t('.add_translation'), f, :custom_property_translations, {count: 3}

Подробнее о доступных параметрах здесь: https://github.com/nathanvda/cocoon/blob/be59abd99027b0cce25dc4246c86d60b51c5e6f2/lib/cocoon/view_helpers.rb

Другие вопросы по тегам