Project: YugabyteDB (App Definition and Development / Database)
File: ysql-rails-activerecord.md

title: Build a Ruby application that uses ActiveRecord and YSQL headerTitle: Build a Ruby application linkTitle: Ruby description: Build a Ruby application that uses Rails ActiveRecord and the YSQL API menu: v2.14: parent: build-apps name: Ruby identifier: ruby-2 weight: 553 type: docs <ul class="nav nav-tabs-alt nav-tabs-yb"> <li > <a href="{{< relref "./ysql-pg.md" >}}" class="nav-link"> <i class="icon-postgres" aria-hidden="true"></i> YSQL - PG Gem </a> </li> <li > <a href="{{< relref "./ysql-rails-activerecord.md" >}}" class="nav-link active"> <i class="icon-postgres" aria-hidden="true"></i> YSQL - ActiveRecord </a> </li> <li> <a href="{{< relref "./ycql.md" >}}" class="nav-link"> <i class="icon-cassandra" aria-hidden="true"></i> YCQL </a> </li> </ul> This tutorial assumes that you have: installed YugabyteDB and created a universe with YSQL enabled. If not, please follow these steps in the . ```sh $ git clone https://github.com/YugabyteDB-Samples/orm-examples.git ``` ```sh bundle install ``` This repository has a Ruby on Rails example that implements a simple REST API server. The scenario is that of an e-commerce application. Database access in this application is managed through ActiveRecord ORM. It consists of the following. The users of the e-commerce site are stored in the users table. The products table contains a list of products the e-commerce site sells. The orders placed by the users are populated in the orders table. An order can consist of multiple line items, each of these are inserted in the orderline table. The source for the above application can be found in the . There are a number of options that can be customized in the properties file located at `config/database.yml`. ```sh $ cd ./ruby/ror ``` ```sh $ ./bin/bundle install ``` Create 2 users. ```sh $ curl --data '{ "firstName" : "John", "lastName" : "Smith", "email" : "jsmith@example.com" }' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/users ``` ```sh $ curl --data '{ "firstName" : "Tom", "lastName" : "Stewart", "email" :

}' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/users ``` Create 2 products. ```sh $ curl \ --data '{ "productName": "Notebook", "description": "200 page notebook", "price": 7.50 }' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/products ``` ```sh $ curl \ --data '{ "productName": "Pencil", "description": "Mechanical pencil", "price": 2.50 }' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/products ``` Create 2 orders. ```sh $ curl \ --data '{ "userId": "2", "products": [ { "productId": 1, "units": 2 } ] }' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/orders ``` ```sh $ curl \ --data '{ "userId": "2", "products": [ { "productId": 1, "units": 2 }, { "productId": 2, "units": 4 } ] }' \ -v -X POST -H 'Content-Type:application/json' http://localhost:8080/orders ``` ```sh $ ./bin/ysqlsh ``` ```output ysqlsh (11.2) Type "help" for help. yugabyte=# ``` ```plpgsql yugabyte=# SELECT count(*) FROM users; ``` ```output count 2 (1 row) ``` ```plpgsql yugabyte=# SELECT count(*) FROM products; ``` ```output count 2 (1 row) ``` ```plpgsql yugabyte=# SELECT count(*) FROM orders; ``` ```output count 2 (1 row) ``` ```sh $ curl http://localhost:8080/users ``` ```output.json { "content": [ { "userId": 2, "firstName": "Tom", "lastName": "Stewart", "email": "tstewart@example.com" }, { "userId": 1, "firstName": "John", "lastName": "Smith", "email": "jsmith@example.com" } ], ... } ``` ```sh $ curl http://localhost:8080/products ``` ```output.json { "content": [ { "productId": 2, "productName": "Pencil", "description": "Mechanical pencil", "price": 2.5 }, { "productId": 1, "productName": "Notebook", "description": "200 page notebook", "price": 7.5 } ], ... } ``` ```sh $ curl http://localhost:8080/orders ``` ```output.json { "content": [ { "orderTime": "2019-05-10T04:26:54.590+0000", "orderId": "999ae272-f2f4-46a1-bede-5ab765bb27fe", "user": { "userId": 2, "firstName": "Tom", "lastName": "Stewart", "email": "tstewart@example.com" }, "userId": null, "orderTotal": 25, "products": [] }, { "orderTime": "2019-05-10T04:26:48.074+0000", "orderId": "1598c8d4-1857-4725-a9ab-14deb089ab4e", "user": { "userId": 2, "firstName": "Tom", "lastName": "Stewart", "email": "tstewart@example.com" }, "userId": null, "orderTotal": 15, "products": [] } ], ... } ``` As highlighted earlier, the source for the above application can be found in the .