Sobes.tech
Middle+

Ruby on Rails'ta modellerin kalıtımını veya polimorfik ilişkileri nasıl uygularsınız?

sobes.tech yapay zeka

AI'dan gelen yanıt

Ruby on Rails'ta modellerin kalıtımı, Single Table Inheritance (STI) veya polimorfik ilişkiler aracılığıyla gerçekleştirilir.

Single Table Inheritance (STI)

STI, farklı nesne türlerinin benzer özelliklere sahip olduğu ancak farklı davranışlar sergilediği durumlar için uygundur. Tüm veriler tek bir tabloda saklanır ve nesne tipi type sütunu ile belirlenir.

  1. Tablo ve type sütununun oluşturulması:

    # migration
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Temel sınıftan türeyen model sınıflarının oluşturulması:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Tüm hayvanlar için ortak mantık
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Köpekler için özgü mantık
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Kediler için özgü mantık
      def meow
        "Meow!"
      end
    end
    
  3. Kullanım:

    # konsol
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Bir Dog nesnesi döner
    

Polimorfik ilişkiler

Polimorfik ilişkiler, bir modelin farklı diğer modellere ait olabileceği durumlar için kullanılır.

  1. İlişkili modelde _id ve _type sütunlarının eklenmesi: Örneğin, Comment modeli Article veya Photo'ya ait olabilir:

    # migration
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Modellerde ilişki bildirimleri: Comment modelinde:

    # app/models/comment.rb
    class Comment < ApplicationRecord
      belongs_to :commentable, polymorphic: true
    end
    

    Article ve Photo modellerinde:

    # app/models/article.rb
    class Article < ApplicationRecord
      has_many :comments, as: :commentable
    end
    
    # app/models/photo.rb
    class Photo < ApplicationRecord
      has_many :comments, as: :commentable
    end
    
  3. Kullanım:

    # konsol
    article = Article.create(title: "Rails İpuçları")
    photo = Photo.create(caption: "Güzel Gün Batımı")
    
    article.comments.create(body: "Harika makale!")
    photo.comments.create(body: "Güzel fotoğraf!")
    
    Comment.first.commentable # Article döner
    Comment.last.commentable  # Photo döner
    

STI ve polimorfik ilişkiler arasındaki seçim, veri yapısına ve modeller arasındaki ilişkilere bağlıdır. STI, "bir-şey-ise" ilişkileri (Dog bir Animal'dır) için, polimorfik ilişkiler ise "sahip-ol" ilişkileri (Article bir Comment'e sahiptir, Photo bir Comment'e sahiptir, Comment ya Article'e ya da Photo'ya ait olabilir) için uygundur.