Отправка сложного JSON с API винограда в PostgreSQL

Я пытаюсь создать API, используя grape, который сохраняет данные JSON в PostgreSQL, когда опубликовано. Вот пример JSON:

{
    "about": "this is about me",
    "company_name": "David Co",
    "company_url": "http://google.com",
    "created_at": "2013-02-03T13:09:37+05:30",
    "email": "[email protected]",
    "first_name": "David",
    "google_plus": "http://google.com",
    "id": 1
}

Это код Руби:

class Posts < Grape::API

  version 'v1', :using => :path
  format :json

  resource 'posts' do
    get "/" do
      Post.all
    end

    get "/:id" do 
      Post.find(params['id'])
    end

    post "/create" do
      Post.create(params['post'])
    end
  end

end

Я следую этому примеру, который отлично работает с приведенным выше JSON.

Как изменить код, чтобы он работал с более сложным JSON, например:

{
 "about": "this is about me",
 "company_name": "David Co",
 "company_url": "http://google.com",
 "created_at": "2013-02-03T13:09:37+05:30",
 "email": "[email protected]",
 "first_name": "David",
 "google_plus": "http://google.com",
 "id": 1,
 "chall": [{
     "attributes": {
         "type": "tegory__c",
         "url": "/services0/sobjects/__c/a08Z0000000RmoTIAS"
     }
}

Вот текущая схема базы данных:

create_table :posts do |t|
  t.string :first_name
  t.string :email
  t.string :company_name
  t.string :google_plus
  t.string :about
  t.string :company_url
  t.timestamps
end

person iJade    schedule 03.02.2013    source источник
comment
Что произойдет, если вы попытаетесь использовать более сложный JSON? Любые сообщения об ошибках в Ruby или PostgreSQL?   -  person    schedule 03.02.2013
comment
на самом деле это не сработает ... я не включил эти поля в postgres. Я не знаю, как рисовать схему базы данных. Я только что обновил текущую схему базы данных.   -  person iJade    schedule 03.02.2013


Ответы (1)


Ваш attributes будет отдельной таблицей, включая тип и URL. Тогда ваша chall будет таблицей ссылок, которая отображает одну строку posts в несколько строк attributes. Это позволяет вам помещать данные в этом формате в базу данных.

Конечно, имея только одну запись для attributes, трудно представить полную схему, но это должно дать вам некоторое представление о том, как их соединить.

Обратите внимание: если вы хотите, вы можете упростить ситуацию, если ваш JSON будет выглядеть так:

"chall": [{
     "type": "tegory__c",
     "url": "/services0/sobjects/__c/a08Z0000000RmoTIAS"
}]

так как тогда chall будет прямой связью один-ко-многим с posts, хотя опять же трудно сказать, действительно ли это или нет, учитывая отсутствие данных в примере JSON. Надеюсь, это укажет вам правильное направление.

Если я предполагаю первое, то ваша схема выглядит примерно так:

create_table :posts do |t|
  t.string :first_name
  t.string :email
  t.string :company_name
  t.string :google_plus
  t.string :about
  t.string :company_url
  t.timestamps
end

create_table : attributes do |t|
  t.string :type
  t.string :url
end

create_table post_attributes do |t|
  t.references : posts
  t.references : attributes
end

В этом случае у вас есть отношения «многие ко многим» между записями и атрибутами.

person Community    schedule 03.02.2013
comment
Добавлены определения таблиц. - person ; 03.02.2013
comment
ну, я новичок во всей этой штуке с виноградным API. Мне нужно только внести изменения в таблицы. Нет необходимости менять какой-либо рубиновый код? - person iJade; 03.02.2013