# Active Orient and Rails The usage of Orientdb via ActiveOrient in Rails requires just a few steps. Based on a Rails 5 installation ```ruby rvm install 2.4 rvm use 2.4 gem install bundler gem install nokogiri gem install rails rails -v # Rails 5.0.1 ``` create your working directory and initialize the system ```ruby mkdir rails_project; cd rails_project rails new -OCT . ``` This initializes a Rails-Stack, without active-record, action-cable and the test-suite. (We will use rspec later) This can be checked by inspecting «/config/application.rb « ```ruby rails s puma ``` should work at this stage. ## Modify the Gemfile Inform rails to use orientdb and active-orient ``` echo " gem 'active-orient' , :path => '/home/your_cloned_active_orient_path/activeorient' " >> Gemfile # or echo " gem 'active-orient' , :git => 'https://github.com/topofocus/active-orient.git' " >> Gemfile ``` Run the bundler ``` bundle install & bundle update ``` ## Copy Initializer and Configuration Files change to the base-dir of the gem --> bundle show active-orient then copy * rails/activeorient.rb to config/initializers in the rails-project dir * rails/connect.yml to config in the rails project * rails/config.yml to config in the rails project and modify the yml-files accordingly. (Depending on your settings, you might have to adjust tab-levels) The database is present in the rails console, and ```ruby rails c puts ActiveOrient:show_classes V.count V.first E.count ``` should display details. **Notice** The spring-facility is running in the background. Stop the server prior reloading the console ( ./bin/spring stop ). ## Model-files The final step is to generate Model-Files. In «/config/config.yml» the «:model_dir»-var points to the location of the model-files. The default is 'lib/orient'. Change to your needs. Don't use the app directory, as its autoloaded too early. Upon startup, present model-classes are destroyed and overridden by present files in the autoload directory. After envoking the rails console, the logfile displays sucessfully loaded and missing files, ie. ``` 14.01.(08:28:45) INFO->ModelClass#RequireModelFile:..:model-file not present: /home/topo/workspace/orient-rails/lib/orient/followed_by.rb 14.01.(08:28:45) INFO->ModelClass#RequireModelFile:..:/home/topo/workspace/orient-rails/lib/orient/v.rb sucessfully loaded ``` ## Model-file Example To query the GratefulDeadConcerts Database, «v.rb» hosts the essential model methods. As always, use «def self.{method}« for class methods and simply «def {method}» for methods working on the record level. ``` 1 class V 2 def self.artists **attributes 3 names 'artist', **attributes 4 end 5 6 def self.songs **attributes 7 names 'song', **attributes 8 end 9 10 def self.types 11 oo = OrientSupport::OrientQuery 12 this_query = oo.new distinct: [:type, :a ] # --> "select distinct( type ) as a " 13 query_database( this_query ).a # returns an array of types, i.e. ["artist", "song"] 14 end 15 private 16 def self.names type, sort: :asc, limit: 20, skip: 0 17 puts "in names" 18 oo = OrientSupport::OrientQuery 19 query_database oo.new( where: {type: type }, 20 order: { name: sort } , 21 limit: limit , 22 skip: skip ) 23 end 24 end ``` Now ```ruby V.types V.artists limit: 15, skip: 34, sort: :desc ``` queries the database, fetches 15 artists. ## Routing for now, restful routing has some restrictions. Rails-routing is depending on the "id"-attribute. Even if this is remapped to rid, the ressources-entries in "config/routes.rb" have to be modified by ```ruiby resources :{controller}, id: /[^\/]+/ ``` this enables the usage of id: "xx:yy" In the controller the record is fetched as usual: ```ruby def show @{your coice} = {ActiveOrient-Model-Class}.autoload_object params[:id] end ```