Вы не можете ... По крайней мере, не так, как вы это делаете.Подумайте о том, что делает рельсы.Он автоматически упорядочивается по столбцу id (PK) таблицы.Поскольку записи, которые вы строите, не будут иметь идентификатора, они будут помещаться в конце - каждый раз.Вы МОЖЕТЕ найти и использовать CREATE и выдумки, но это грязно и может привести к серьезным проблемам.
Чтобы поддерживать порядок (каламбур), вам понадобится какая-то система указателей массива:
class FoobarController < ApplicationController
def edit
@foobar = Foobar.find(params[:id])
@places = Array.new
APP_CONFIG['locations'].each do |location|
@places << @foobar.places.build(:name => location)
end
end
end
Затем, по вашему мнению, вам нужно будет перебрать массиви вручную построить форму.Я рекомендую просмотреть исходный код и посмотреть, как вначале появляется вложенная форма.
Вот как я бы к ней подходил - собирать каждый раз (без find_by_name).Затем в вашей модели вы хотите:
class Foo < ActiveRecord
has_many :places
accepts_nested_attributes_for :places, :reject_if => { |a| !APP_CONFIG['locations'].include?(a) || Place.find_by_name(a).nil? || !Place.find_by_name_and_foo_id(a, self.id).nil? }
end
Теперь я на самом деле не тестировал этот код именно для вашего случая, поэтому я разобью его;
1.) Отклонитьесли представленный атрибут отсутствует в глобальном массиве (больше из соображений безопасности)
2.) Отклонить, если имя не является допустимым местом (опять же, из соображений безопасности)
3.) Отклонить, если для этого foo существует место УЖЕ (ваш класс has_many: place)