Создание глубоко вложенного объекта в Rails - PullRequest
0 голосов
/ 14 ноября 2011

Я создал небольшой API, который при публикации объекта JSON создает репрезентативные записи модели.Данные выглядят так:

{
  "customer": {
    "email": "michael@myemail.com",
    "first_name": "Michael T. Smith",
    "last_name": "",
    "shipping_address_1": "",
    "telephone": "5551211212",
    "source": "Purchase"
  },
  "order": {
    "system_order_id": "1070",
    "shipping_address_1": "",
    "billing_address_1": "123 Your Street",
    "shipping": "0",
    "tax": "0",
    "total": "299",
    "invoice_date": 1321157461,
    "status": "PROCESSING",
    "additional_specs": "This is my info!",
    "line_items": [
      {
        "quantity": "1",
        "price": "239",
        "product": "Thing A",
        "comments": "comments"
        "specification": {
          "width": "12",
          "length": "12",
        },
      },
      {
        "quantity": "1",
        "price": "239",
        "product": "Thing A",
        "comments": "comments"
        "specification": {
          "width": "12",
          "length": "12",
        },
      },
    ]
  }
}

Вопрос в том, как создать вложенные объекты.Мои модели настроены так:

class Order < ActiveRecord::Base
  has_many :line_items
  belongs_to :customer

  accepts_nested_attributes_for :line_items
end

class LineItem < ActiveRecord::Base
  belongs_to :order
  has_many :specifications
end

class Specification < ActiveRecord::Base
  belongs_to :LineItem 
end

Я пытаюсь создать записи, используя этот код:

@order = @customer.orders.build(@data[:order])
@order.save

Есть ли лучший способ сделать это?В настоящее время я получаю эту ошибку: ActiveRecord::AssociationTypeMismatch in ApiController#purchase_request LineItem(#70310607516240) expected, got Hash(#70310854628220)

Спасибо!

1 Ответ

2 голосов
/ 14 ноября 2011

accepts_nested_attributes_for определяет новый метод установки для ассоциации: к нему добавляется исходное имя с добавлением _attributes.

В вашем случае в вашем * * * *Модель 1007 *, которую вы должны использовать, чтобы воспользоваться функцией вложенных атрибутов.Возможно, сработает что-то простое, например, замена ключа перед построением модели, например:

@data[:order][:line_items_attributes] = @data[:order].delete(:line_items)
@order = @customer.orders.build(@data[:order])
@order.save
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...