Суммируйте все значения для определенного ключа в JSON в Ruby - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть следующий json, хранящийся в столбце в моей базе данных. Я использую этот JSON для заполнения таблицы в одном из моих представлений, который прекрасно работает. Теперь я пытаюсь вычислить сумму всех значений для определенного ключа -> сумму каждого ("ownership_percentage") для каждого "shareholder".

{
   "captable":{
      "id":28,
      "version":1,
      "name":"CapTable",
      "company_id":22,
      "created_at":"2018-10-31T18:56:03.965Z",
      "updated_at":"2018-10-31T18:57:30.626Z",
      "total_stocks_in_company":"400.0"
   },
   "event":{
      "status_locked":null,
      "id":51,
      "price_per_share":"1000.0",
      "total_company_stocks_after_event":"400.0",
      "name":"2nd event ",
      "date":"2018-10-31",
      "currency":"SEK",
      "valuation":"400000.0",
      "created_at":"2018-10-31T18:57:17.282Z",
      "updated_at":"2018-10-31T18:57:30.676Z",
      "captable_id":28,
      "company_id":22,
      "snapshot":"{\"captable\":{\"id\":28,\"total_stocks_in_company\":\"400.0\",\"version\":1,\"name\":\"CapTable\",\"company_id\":22,\"created_at\":\"2018-10-31T18:56:03.965Z\",\"updated_at\":\"2018-10-31T18:57:30.626Z\"},\"event\":{\"status_locked\":null,\"id\":51,\"price_per_share\":\"1000.0\",\"total_company_stocks_after_event\":\"400.0\",\"name\":\"2nd event \",\"date\":\"2018-10-31\",\"currency\":\"SEK\",\"valuation\":\"400000.0\",\"created_at\":\"2018-10-31T18:57:17.282Z\",\"updated_at\":\"2018-10-31T18:57:30.665Z\",\"captable_id\":28,\"company_id\":22,\"snapshot\":null},\"shareholders\":[{\"id\":52,\"shareholder\":\"Peter\",\"name\":\"Peter\",\"number_of_stocks\":\"100.0\",\"company_id\":22,\"created_at\":\"2018-10-31T18:55:42.730Z\",\"updated_at\":\"2018-10-31T18:57:30.637Z\",\"ownership_percentage\":\"0.25\",\"email\":\"\",\"telephone\":\"\"},{\"id\":53,\"shareholder\":\"Jane\",\"name\":\"Jane\",\"number_of_stocks\":\"100.0\",\"company_id\":22,\"created_at\":\"2018-10-31T18:55:49.490Z\",\"updated_at\":\"2018-10-31T18:57:30.644Z\",\"ownership_percentage\":\"0.25\",\"email\":\"\",\"telephone\":\"\"},{\"id\":54,\"shareholder\":\"Sally\",\"name\":\"Sally \",\"number_of_stocks\":\"200.0\",\"company_id\":22,\"created_at\":\"2018-10-31T18:55:56.192Z\",\"updated_at\":\"2018-10-31T18:57:30.651Z\",\"ownership_percentage\":\"0.5\",\"email\":\"\",\"telephone\":\"\"}]}"
   },
   "shareholders":[
      {
         "id":52,
         "shareholder":"Peter",
         "name":"Peter",
         "number_of_stocks":"50.0",
         "company_id":22,
         "created_at":"2018-10-31T18:55:42.730Z",
         "updated_at":"2018-10-31T18:58:31.406Z",
         "ownership_percentage":"0.125",
         "email":"",
         "telephone":""
      },
      {
         "id":53,
         "shareholder":"Jane",
         "name":"Jane",
         "number_of_stocks":"150.0",
         "company_id":22,
         "created_at":"2018-10-31T18:55:49.490Z",
         "updated_at":"2018-10-31T18:58:31.410Z",
         "ownership_percentage":"0.375",
         "email":"",
         "telephone":""
      },
      {
         "id":54,
         "shareholder":"Sally",
         "name":"Sally ",
         "number_of_stocks":"200.0",
         "company_id":22,
         "created_at":"2018-10-31T18:55:56.192Z",
         "updated_at":"2018-10-31T18:57:30.651Z",
         "ownership_percentage":"0.5",
         "email":"",
         "telephone":""
      }
   ]
}

Просто чтобы добавить еще один слой - Owner_percentage - это строка, поэтому перед преобразованием суммы ее необходимо преобразовать в десятичную / с плавающей запятой, чтобы один лайнер стал немного длиннее :)

Я хотел бы добиться следующего (псевдокод), но у меня возникают проблемы с поиском одного лайнера, который мне подходит. Хотелось бы, чтобы толчок в правильном направлении здесь!

<td> <%= snapshot_json["shareholders"]["ownership_percentage"].to_f.sum %> </td>

Примечание. В этом примере значение owner_percentage должно составлять до 1,0 (т. Е. 100%).

1 Ответ

0 голосов
/ 06 ноября 2018

Вам нужно будет передать блок в Array # sum в вашем shareholders массиве

snapshot_json["shareholders"].sum { |x| x["ownership_percentage"].to_f }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...