{"id":16458785,"url":"https://github.com/murat/tutorial-active-record-sharing","last_synced_at":"2026-05-01T13:32:21.515Z","repository":{"id":45100941,"uuid":"195427194","full_name":"murat/tutorial-active-record-sharing","owner":"murat","description":"ActiveRecord modellerini projeler arası paylaştırmak | örnek uygulamalar","archived":false,"fork":false,"pushed_at":"2023-01-20T04:03:00.000Z","size":31,"stargazers_count":2,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-11T19:32:56.424Z","etag":null,"topics":["activerecord","rails","rubygem","sqlite3"],"latest_commit_sha":null,"homepage":"https://medium.com/@muratbastas/activerecord-modellerini-projeler-aras%C4%B1-payla%C5%9Ft%C4%B1rmak-f3a64da42d15","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/murat.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-07-05T14:57:37.000Z","updated_at":"2020-03-02T08:31:43.000Z","dependencies_parsed_at":"2023-02-11T23:30:34.444Z","dependency_job_id":null,"html_url":"https://github.com/murat/tutorial-active-record-sharing","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/murat/tutorial-active-record-sharing","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/murat%2Ftutorial-active-record-sharing","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/murat%2Ftutorial-active-record-sharing/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/murat%2Ftutorial-active-record-sharing/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/murat%2Ftutorial-active-record-sharing/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/murat","download_url":"https://codeload.github.com/murat/tutorial-active-record-sharing/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/murat%2Ftutorial-active-record-sharing/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32499681,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["activerecord","rails","rubygem","sqlite3"],"created_at":"2024-10-11T10:46:21.512Z","updated_at":"2026-05-01T13:32:21.447Z","avatar_url":"https://github.com/murat.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ActiveRecord modellerini projeler arası paylaştırmak\n\nGünümüzde microservis, dağıtık uygulamar.. vs popüler olmaktan ziyade, otomatik ölçeklenen uygulamalar geliştirmek için gerekli bir yaklaşım halini aldı. Geliştirdiğimiz uygulamanın farklı görevleri olan kısımlarını farklı uygulamalar olarak dağıtabilmek için projeleri bölmeye başladık. Ben de böyle bir ihtiyaçtan yola çıkıp kompleks bir yapısı olan ve refactor gerektiren bir rails uygulamasını görevlerine göre ufak uygulamacıklara bölmeye başladım. Bunu yaparken en önemli sorunum kod kopyalamadan(duplicate) etmeden bu işin altından nasıl kalkarım, daha güzel bir deyişle data modelimi birden fazla rails ve ya rails olmayan projeler arasında nasıl paylaştırırım sorusuna odaklandım. Denemelerim sonucunda sadece ActiveRecord sınıflarını taşıyan bir ruby gem'i yaparak, bu gem'i bir rails projesi, bir sinatra projesi, bir de saf ruby betiği ile kullanabilir hale getirdim. Bu yazıda bulgularımı bir rehber niteliğinde paylaşmak istiyorum.\n\n## İçerik\n\n- [ActiveRecord sınıflarını taşıyan bir ruby gem'i](#activerecord-sınıflarını-taşıyan-bir-ruby-gemi)\n- [Veritabanı oluşturalım](#veritabanı-oluşturalım)\n- [Saf ruby betiklerinde nasıl kullanırım?](#saf-ruby-betiklerinde-nasıl-kullanırım)\n  - [Satır içi bundle](#satır-içi-bundle)\n- [Sinatra](#sinatra)\n- [Rails](#rails)\n- [Son](#son)\n\n## ActiveRecord sınıflarını taşıyan bir ruby gem'i\n\nYeni bir ruby gem'i oluşturmak için bundle bize aşağıdaki gibi bir template veriyor.\n\n```bash\n➜ bundle gem models\n...\n  create  models/Gemfile\n  create  models/lib/models.rb\n  create  models/lib/models/version.rb\n  create  models/models.gemspec\n  create  models/Rakefile\n  create  models/README.md\n  create  models/bin/console\n  create  models/bin/setup\n  create  models/.gitignore\n  create  models/.travis.yml\n  create  models/.rspec\n  create  models/spec/spec_helper.rb\n  create  models/spec/models_spec.rb\n  create  models/LICENSE.txt\n  create  models/CODE_OF_CONDUCT.md\n```\n\n```bash\n# :)\n➜ mv models models_rb\n```\n\nTüm uygulama kodlarımızı **lib** dizini içinde yazacağız. Örnek olarak **Student** adında bir ActiveRecord modeli oluşturup diğer projelerimizde bunu kullanacağız. Öncelikle .gemspec dosyasında gerekli satırları düzenledikten sonra Gemfile'a 'activerecord' gem'ini ekliyoruz.\n\n```ruby\n# Gemfile\n\nsource \"https://rubygems.org\"\n\ngem \"activerecord\", \"~\u003e 5.0\"\n\n# Specify your gem's dependencies in models.gemspec\ngemspec\n```\n\n`lib/models` dizini altında da Student sınıfını oluşturup `lib/models.rb` dosyasında `require` ederek gem'i paketleyebiliriz.\n\n```ruby\n# lib/models/student.rb\nrequire \"active_record\"\n\nmodule Models\n  class Student \u003c ActiveRecord::Base; end\nend\n```\n\n```ruby\n# lib/models.rb\nrequire \"models/version\"\nrequire \"models/student\"\n\nmodule Models\n  class Error \u003c StandardError; end\nend\n```\n\nGem'i paketleyip rubygems'de yayınlamak isterseniz gerekli adımları [şuradan](https://guides.rubygems.org/publishing/) öğrenebilirsiniz. Biz şimdilik yerel adres üzerinden diğer projelerimize dahil edeceğiz. Fakat .gemspec dosyamızdaki `spec.files` değeri `git ls-files -z` komutundan dönen dosyaları `LOAD_PATH` e dahil ettiği için `git add .` ve `git commit -m \"mesaj\"` komutlarını çalıştırmak gerekiyor.\n\n## Veritabanı oluşturalım\n\nBasit bir örnek olacağı için sqlite3 ile bir veritabanı oluşturacağım. Bunun için `database` adında bir dizin açarak içinde `sqlite3 app.sqlite3` komutunu çalıştırıyorum ve aşağıdaki sql ile students tablosunu oluşturuyorum.\n\n```sql\nCREATE TABLE students(\n  id INT PRIMARY KEY NOT NULL,\n  name TEXT NOT NULL\n);\n```\n\nTablo oluşturduktan sonra kontrol amaçlı `.tables` komutunu çalıştırıyor ve tablo göründüyse `.quit` komutu ile çıkıyorum.\n\n## Saf ruby betiklerinde nasıl kullanırım?\n\nBaşka bir dizine giderek bir `app.rb` dosyası oluşturalım.\n\n### Satır içi bundle\n\nBir projeye `bundle` edilmiş bir gem'i dahil etmek için ilk akla gelen yöntem `bundle init` diyerek bir `Gemfile` oluşturmak olabilir ama bu sadece bir dosyalık betik olacağından yeni öğrendiğim [`bundler/inline`](https://bundler.io/v2.0/guides/bundler_in_a_single_file_ruby_script.html) kullanarak devam edeceğim. Bu işimizi çok kolaylıştıracak. `app.rb` dosyasına aşağıdakileri ekleyelim.\n\n```ruby\n# app.rb\nrequire 'bundler/inline'\n\ngemfile do\n  source 'https://rubygems.org'\n\n  gem \"models\", path: \"../models_rb\"\n  gem \"activerecord\"\n  gem \"sqlite3\", \"~\u003e 1.4\"\nend\n\nActiveRecord::Base.establish_connection(\n  adapter: \"sqlite3\",\n  database: \"../database/app.sqlite3\"\n)\n\nputs 'Gems installed and loaded!'\nputs \"Total student: #{Models::Student.count}\"\n\nModels::Student.create id: Models::Student.order(id: :desc).limit(1).first.id + 1, name: \"murat\"\nputs \"Total student: #{Models::Student.count}\"\n```\n\nVe ruby dosyamızı `ruby app.rb` komutu ile çalıştırabiliriz. Göreceğiniz üzere ActiveRecord modelimiz saf bir ruby betiğinde kullanılabilir halde.\n\nNot: Gerçek hayatta veritabanımızı düzgün oluşturacağımız id değerini biz vermeyeceğiz.\n\n## Sinatra\n\nBasit bir sinatra projesi oluşturalım.\n\n```bash\n➜ cd .. \u0026\u0026 mkdir sinatra_app \u0026\u0026 cd sinatra_app\n➜ bundle init\nWriting new Gemfile to sinatra_app/Gemfile\n```\n\nGemfile'a aşağıdakileri ekleyip `bundle install` çalıştıralım.\n\n```ruby\n# Gemfile\n\ngem \"models\", path: \"../models_rb\"\ngem \"sinatra\"\ngem 'sinatra-activerecord'\ngem \"rake\"\ngem \"json\"\ngem \"sqlite3\", \"~\u003e 1.4\"\n```\n\nVe app.rb adında bir dosya açıp aşağıdakileri ekleyelim.\n\n```ruby\n# app.rb\nrequire \"sinatra\"\nrequire \"sinatra/activerecord\"\nrequire \"json\"\nrequire \"models\"\n\nset :database, {adapter: \"sqlite3\", database: \"../database/app.sqlite3\"}\n\nget \"/\" do\n  content_type :json\n  Models::Student.all.to_json\nend\n```\n\nVe aşağıdaki şekilde çalıştıralım,\n\n```bash\n➜ bundle exec ruby app.rb\n```\n\nŞimdi tarayıcımızdan [`http://localhost:4567`](http://localhost:4567) adresine gittiğimizde veritabanına eklediğimiz öğrencileri json olarak göreceğiz.\n\n## Rails\n\nBir rails uygulaması oluşturalım, pratik olsun diye `--api` flag'i ile oluşturacağım.\n\n```bash\n➜ cd .. \u0026\u0026 rails new rails_app --api -B -T\n\n➜ cd rails_app\n```\n\nGemfile'a `models` gem'imimizi ekleyelim\n\n```ruby\n# Gemfile\n# ...\ngem \"models\", path: \"../models_rb\"\n```\n\n`bundle install` komutunu çalıştırıp `home/index` diye bir rota oluşturalım.\n\n```bash\n➜ rails g controller home index\n```\n\n`home_controller` `index` metoduna aşağıdakini yazalım.\n\n```ruby\n# home_controller.rb\n\n# ...\n  def index\n    render json: { students: Models::Student.all }\n  end\nend\n```\n\nVe son olarak `database.yml`'da sqlite database adresimizi güncelleyip `rails s` komutu ile sunucusunu ayağa kaldıralım. Ve tarayıcımızdan [`http://localhost:3000/home/index`](http://localhost:3000/home/index) adresine gidip öğrencilere bakalım.\n\n## Son\n\nArtık `models` gibi bir gem geliştirip tüm ActiveRecord sınıflarımızı yazarak, birden fazla, farklı tipte uygulamada ortak akıl kullanabilir olduk. Faydalı olması dileğiyle.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmurat%2Ftutorial-active-record-sharing","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmurat%2Ftutorial-active-record-sharing","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmurat%2Ftutorial-active-record-sharing/lists"}