1

Когда я использую ActiveAdmin для редактирования одного Агентства, я могу выбрать Город и связать его с Агентством. Город связан с Агентством, но город все время дублируется в базе данных.Activeadmin, дублирование has_many records

Мои модели:

# agency.rb 
class Agency < ActiveRecord::Base 
    has_many :agency_cities 
    has_many :cities, through: :agency_cities 
    accepts_nested_attributes_for :cities, allow_destroy: true 
end 

# city.rb 
class City < ActiveRecord::Base 
    has_many :agency_cities 
    has_many :agencies, through: :agency_cities 
end 

# AgencyCity.rb 
class AgencyCity < ActiveRecord::Base 
    belongs_to :agency 
    belongs_to :city 
end 

Я прочитал документ из Activeadmin и добавил [:id] permit_parameter, но я до сих пор есть проблема, я очень смущен.

# admin/agency.rb 
ActiveAdmin.register Agency do 
    permit_params :name, :picture, 
    cities_attributes: [:id, :name, :description, :_destroy] 

    form do |f| 
    f.inputs "Agencies" do 
     f.input :picture, as: :file 
     f.input :creation_date, label: 'Creation Date' 
     f.input :name, label: 'Name' 
    end 
    end 

    f.inputs do 
    f.has_many :cities do |k| 
     k.input :name, label: 'City', 
     as: :select, 
     collection: City.all.map{ |u| "#{u.name}"} 
     k.input :_destroy, as: :boolean 
    end 
    end 
    f.actions 
end 

ответ

1

Вы пытаетесь связать существующие города с агентством, таким образом, вы должны сделать это таким образом:

ActiveAdmin.register Agency do 
    permit_params city_ids: [] # You need to whitelist the city_ids 

    form do |f| 
    f.inputs "Agencies" do 
     f.input :picture, as: :file 
     f.input :creation_date, label: 'Creation Date' 
     f.input :name, label: 'Name' 
     f.input :cities, as: :check_boxes, checked: City.pluck(&:id) # this will allow you to check the city names that you want to associate with the agency 
    end 
    end 
end 

Это позволит вам связать выбранные города с соответствующим агентством, не создавая (дублируя) новые города в базе данных. Я думаю, что это то, что вы ищете :-)

1

Вы можете проверить в генерируемый HTML, что значения параметра в городе выберите вход являются название города (не идентификатор). Попробуйте так: collection: City.all.map{ |u| [u.name, u.id]}

Некоторые ссылки: http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html

+0

С 'collection: City.all.map {| u | [u.name, u.id]} ' Значения параметров - это id, а не название города. Когда я обновляю агентство с городом, запись по-прежнему дублируется, но новая запись имеет этот HTML '<параметр значение =«3»> 1' (я предполагаю 1 является идентификатором дублируется запись) Проблема, вероятно, в строке кода, который вы указали, я буду работать над этим, спасибо – Matt

Смежные вопросы