Чтобы ответить на ваш вопрос
def new
#First create the new product object assuming you have a current_user available. If not you will need to make a current_)user available.
@product = current_user.build_product
#Now build a new location for the product
location = @product.build_location # You don't need location to be an instance variable.
#when you reference @location in your form you should now be using fields_for :locations instead.
#build a new product_date object for the location_product_dates array
product_date = @location.product_dates.build
#Now add that product date object to the product
product.product_date = product_date
end
Добавьте объявления accepts_nested_attributes к соответствующим моделям и используйте объявления fields_for в соответствующих формах продукта, чтобы ваши действия по созданию и обновлению не нуждались в каких-либо изменениях, так как объявления fields_for в форме будут располагать связанные объекты их данные вложены в хэш продуктов, когда они отправляются обратно в действия создания и обновления.
Соедините это с объявлениями acceptpts_nested_attributes_for для всех нужных моделей, и все будет автоматически обновлено / создано
Это отвечает на ваш вопрос. Новое действие создает все записи и устанавливает все ассоциации для вас, но мне кажется, что вам не нужно указывать дату продукта, связанную с продуктом, поскольку она уже связана с местоположением, связанным с продуктом, и как В расположении может быть много продуктов (при условии, что вы исходите из нового действия), вам будет сложно определить, какая product_date из множества записей местоположения и связанных с ними записей product_date должна быть добавлена непосредственно в продукт.
Полагаю, у вас немного неправильные ассоциации.
Вам также следует рассмотреть возможность рефакторинга этого нового действия в метод класса в модели продукта, чтобы вы могли сделать что-то вроде
@product = Product.new_with_associations(current_user)
Значение def self.new_with_associations должно просто выполнять почти то же самое, что и код, который я дал вам для нового действия, но вам нужно будет передать current_user в качестве параметра в качестве хеша сеанса (именно здесь current_user в конечном итоге из-за) недоступна для моделей по очень веской причине.
Использование этого метода в классе для продукта не только очищает код вашего контроллера, но и делает его повторно используемым и более простым для тестирования как с консоли, так и с вашего набора тестов