Как сохранить значение данных JSON в БД в рельсах? - PullRequest
0 голосов
/ 28 июня 2018

Мне нужно сохранить данные json в базу данных, данные извлекаются из стороннего API.

образец JSON:

 [{ "name"=>"test", "number"=>"1234", "email"=>"test@t.com"},
  { "name"=>"user", "number"=>"5678", "email"=>"yser@t.com"}]

Модель содержит: username, number_phone, y_email

Я хочу сохранить name в username и number в number_phone.

Извлечение данных:

rdb = RestdbApi.new
body = rdb.call

Обновлено

Нужно хранить все данные только для первого элемента

Данные JSON постоянно меняются, необходимо постоянно сохранять

Ответы [ 4 ]

0 голосов
/ 30 июня 2018

Вы можете использовать .find_or_create_by, чтобы не дублировать данные. LINK

rdb = RestdbApi.new
body = rdb.call

body.each do |data|
  # YourModel: make sure to change to yr own model name
  YourModel.find_or_create_by(email: data["y_email"])(
    username:     data["name"],
    number_phone: data["number"],
    y_email:      data["email"]
  )
end
0 голосов
/ 28 июня 2018

В соответствии с общим описанием, если я правильно понимаю, вам нужно получить значения из json и сохранить их в соответствующих столбцах в базе данных.

Для того же, предположим, у вас есть json (назовем его result_json), как упомянуто в посте:

rdb = RestdbApi.new
body = rdb.call  # [{ "name"=>"test", "number"=>"1234", "email"=>"test@t.com"}]
result_json = JSON.parse(body)

Теперь предположим, что у вас есть пользовательский класс, который сопоставлен с БД для сохранения соответствующих значений, затем

user = User.new
user.username = result_json[0]["name"]
user.number_phone = result_json[0]["number"]
user.save # note that this line will map the records in the User instance to the database.
0 голосов
/ 29 июня 2018

Я бы сделал что-то подобное

rest_db_api = RestdbApi.new

user_records_from_api = JSON.parse(rest_db_api.call)

(Я предполагаю, что user_records_from_api теперь будет содержать массив хэшей, как показано ниже:

[{ "name"=>"test", "number"=>"1234", "email"=>"test@t.com"},{ "name"=>"user", "number"=>"5678", "email"=>"yser@t.com"}]

затем вы можете просто перебрать этот хеш и создать запись для каждого (я предполагаю, что ваша модель называется User)

user_records_from_api.map(&:with_indifferent_access).each do |attribues|
  User.create!(
    username: attributes[:name],
    number_phone: attributes[:number],
    y_email: attributes[:email]
  )
end

примечание: метод with_indifferent_access, который я использовал, - это просто удобная вещь, предоставляемая платформой rails, которая позволяет вам иметь хэш со строковыми ключами и получать к ним доступ с помощью символов (или наоборот) - ActionController::Parameters ( в рельсах) использует это

0 голосов
/ 28 июня 2018

Если у вас уже есть все настройки для получения ответа, вы можете сделать что-то вроде этого:

response = [{ "name"=>"test", "number"=>"1234", "email"=>"test@t.com"}]

YourModel.create(
  username: response[0]["name"],
  number_phone: response[0]["number"],
  y_email: response[0]["email"]
)

Выше показано, как получить доступ к индексу для отображаемого ответа, а затем создать свой объект с атрибутами ответа. Если вы ожидаете иметь несколько ответов в ответе, вы должны использовать цикл и сделать что-то похожее:

response = [{ "name"=>"test", "number"=>"1234", "email"=>"test@t.com"}, { "name"=>"test", "number"=>"1234", "email"=>"test@t.com"}]

response.each_with_index do |_, i|
  YourModel.create(
    username: response[i]["name"],
    number_phone: response[i]["number"],
    y_email: response[i]["email"]
  )
end

Надеюсь, это поможет!

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