2014-09-11 5 views
0

Кто-нибудь знает, как создать нового родителя с существующими детьми?Создать родителя с существующими детьми

class Order < ActiveRecord::Base 
    has_many :jobs 
    accepts_nested_attributes_for :jobs 
end 

class Job < ActiveRecord::Base 
    belongs_to :quote 
    belongs_to :order 
end 

С вложенными переменными, я могу построить один или несколько рабочих мест (дети) с новым порядком (родитель) и метод создания автоматически создает новый родительский с его новыми детьми. Однако у меня есть группа существующих детей (задания, созданные в цитате), и я хочу включить их в новую родительскую форму. Когда вы нажимаете submit для создания нового заказа, я хочу, чтобы он создал нового родителя и обновил выбранные дочерние элементы с этим новым родительским идентификатором.

У меня грязный код, который будет делать это в методе создания, сохраняя новый порядок (родительский), а затем обновляя каждое задание (детей) с помощью нового order_id, но есть ли способ сделать это автоматически?


Фактический код является сложным, так что вот его суть.

Предположим, что есть цитата с несколькими заданиями, поэтому переменная quote_id во всех этих заданиях указывает на цитату и @ quote.jobs = массив этих заданий.

Вот что у меня теперь есть:

В модели заказа я добавил:

attr_accessor :quote_id 

В контроллере заказа:

def new quote_id 
    @quote = Quote.find(quote_id) 
    @order = Order.new 

и в представлении

<%= simple_form_for @order, :html => { :class => 'form-horizontal' } do |f| %> 
    <%= f.input :quote_id, value: @quote.id, as: :hidden %> 
    <%= f.input :account_number %> 
    ... 
    <table> 
    <thead><tr> ... column headings here ... </tr></thead> 
    <tbody> 
     <% @quote.jobs.each do |q| %> 
     <tr> 
      <td><%= q.description %></td> 
      <td><%= q.price %></td> 
     </tr> 
     <% end %> 
     <tr><%= ... add a row with the total price ... %></tr> 
    </tbody> 
    </table> 

    <%= f.button :submit, "Place My Order" %> 
<% end $> 

Затем в заказе Контроллер

def create 
    ... 
    if @order.save 
    Quote.find(params[quote_id]).jobs.each do |job| 
     job.update(order_id: @order.id) 
    end 
    end 
    ... 

То, что я предпочел бы это для рабочих параметров, которые будут обрабатываться как вложенные объекты в форме, чтобы они могли быть автоматически обновляться на заказ создать с order.id и, возможно, несколько других параметров. Я пытался (в контроллере)

@order = Order.new 
@quote.jobs.each do |job| 
    @order.jobs << job 
end 

, но они не отображаются в форме с обычной гнездовой формате, и если это работает, я не знаю, будут ли они на самом деле будут обновлены.

+0

В вашем пользовательском интерфейсе или соответствующем коде, как вы загружаете существующие объекты задания, которые будут связаны с этим новым объектом заказа/как вы отправляете данные в свое приложение (через сообщение/создать звонок из формы в ваш веб-сайт и т. д.)? Для меня не зная, как ваш код получает данные для связи, затрудняет предложение потенциального решения. –

+0

можете ли вы опубликовать свой код просмотра, чтобы узнать, что вы на самом деле делаете там? – Surya

ответ

0

Поскольку заказ принимает вложенные атрибуты для задания, я полагаю, вы могли бы вручную создавать и заполнять поля вложенных заданий - как скрытые поля - при создании вашей формы заказа.

<% @quote.jobs.each_with_index do |job, index| %> 
    <input type='hidden' name='order[jobs_attributes][<% index %>][FIELDNAME]' id='order_jobs_attributes_<% index %>_FIELDNAME' value='<% job.something %>' /> 
<% end %> 

Я уверен, что есть способ очистки с simple_form/форм-хелперов использовать = f.input для создания скрытых полей, но я правда лениться выше!

+0

На самом деле, я ошибся. Используя последний раздел в моем сообщении выше, @ order.jobs << job, распознается в формах, и обычная вложенная форма делает только то, что вы предлагаете.Проблема в том, что метод create не обрабатывает его и дает мне: ActiveRecord :: RecordNotFound в OrdersController # create Не удалось найти TranslationJob с ID = 392 для заказа с идентификатором = – mpipkorn

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