Создание объектов и ссылки перед сохранением объекта в БД - PullRequest
0 голосов
/ 07 мая 2010

Извините за смутное название, но я не знал, как задать вопрос в одной строке:)

У меня есть заказ с вложенными группами элементов, в которых снова есть вложенные элементы.пользователь указывает количество товара, которое он хотел бы иметь в каждой группе товаров.Я хотел бы создать эти элементы в методе создания контроллера заказов при создании самого заказа.

У меня здесь две проблемы.Во-первых, как мне установить ссылку на элементы или, что еще лучше, поместить элементы в объект @order, чтобы они сохранялись при сохранении @order?элементы хранятся в БД, как и сейчас код, но ссылка не установлена, поскольку порядок еще не сохранен в БД, поэтому у него пока нет идентификатора.

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

@order = Order.new(params[:order])

@order.itemgroups.each do |f|
  f.amount.times do
    @item = Item.new()
    @item.itemgroup_id = f.id
    @item.save
    end
end

Ответы [ 2 ]

1 голос
/ 07 мая 2010

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

Полагаю, это выглядит так:

class Order < ActiveRecord::Base
   has_many :itemgroups
end

class Itemgroup < ActiveRecord::Base
   belongs_to :order
   has_many :items
end

class Item < ActiveRecord::Base
  belongs_to :itemgroup
end

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

 @order.itemgroups.each do |f|
   f.amount.times do
     item = itemgroup.items.build() #this links the fk before it exists
     #this is where I assume you are doing something with the item
     #otherwise the item class seems pointless
  end
 end
 @order.save #saves dependent objects as well
0 голосов
/ 09 мая 2010

Создайте свой заказ, но поместите все это в транзакцию . Таким образом ActiveRecord удалит ордер, если не сможет сохранить один из элементов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...