Ruby on Rails Model Yapısı: Doğru Yapı ile Kod Kalitesini Arttırın
Ruby on Rails, geliştiricilere sağlam ve ölçeklenebilir web uygulamaları oluşturmak için güçlü araçlar sunar. Ancak, bir projenin başarısı sadece Rails’in sunduğu özelliklerle değil, aynı zamanda kodun düzenli, okunabilir ve sürdürülebilir olmasıyla da yakından ilgilidir. Bu yazımda, Rails modellerinde en iyi uygulamaları, kod düzenleme prensiplerini ve callback sıralamasını inceleyeceğiz.
Model Yapısı ve Sırası
Rails modelleri, belirli bir düzen ve sıra takip edilerek yazıldığında daha anlaşılır ve bakım kolaylığı sağlar. İşte bir modelin nasıl yapılandırılması gerektiğine dair kabul gören kullanım sırası:
- Constants (Sabitler):
- Modelde kullanılacak sabitler en üstte tanımlanır. Sabitler, modelin davranışını veya belirli değerleri tanımlamak için kullanılır.
STATUS_ACTIVE = 'active'
STATUS_INACTIVE = 'inactive'
2. Attribute Accessors(Erişimciler):
attr_accessor
,attr_reader
,attr_writer
gibi makrolar burada yer alır. Bu makrolar, modelin belirli özelliklerine erişim sağlar.
attr_accessor :temporary_token
3. Associations (İlişkiler):
- Modeller arasındaki ilişkiler (
belongs_to
,has_many
,has_one
,has_and_belongs_to_many
) burada tanımlanır.
belongs_to :company
has_many :posts
has_one :profile
4. Validations (Validasyonlar):
- Modelin verilerinin geçerliliğini kontrol eden doğrulamalar (
validates
,validates_presence_of
,validates_uniqueness_of
) burada yer alır.
validates :username, presence: true, uniqueness: true
validates :email, presence: true, format: { with: URI::MailTo::EMAIL_REGEXP }
5. Callbacks (Geri Çağrımlar):
- Belirli olaylar öncesinde veya sonrasında çalışan geri çağrımlar (
before_validation
,after_validation
,before_save
,after_save
,before_create
,after_create
) burada tanımlanır.
before_validation :normalize_username
before_save :set_defaults
before_create :generate_authentication_token
6. Scopes:
- Model için tanımlanan scope’lar (
scope
) burada yer alır. Scope'lar, veritabanı sorgularını basitleştirmek ve tekrar kullanılabilir hale getirmek için kullanılır.
scope :active, -> { where(status: STATUS_ACTIVE) }
scope :recent, -> { order(created_at: :desc) }
7. Class Methods (Sınıf Metotları):
- Model sınıfına özgü metotlar burada tanımlanır. Sınıf metotları, belirli bir model sınıfı üzerinde çalışır ve genellikle veri sorgulama veya işleme işlemleri için kullanılır.
def self.search_by_email(email)
where(email: email)
end
8. Instance Methods (Örnek Metotlar):
- Model örneklerine özgü metotlar burada tanımlanır. Bu metotlar, belirli bir model nesnesi üzerinde çalışır.
def activate!
update!(status: STATUS_ACTIVE)
end
def deactivate!
update!(status: STATUS_INACTIVE)
end
9. Private Methods (Özel Metotlar):
- Özel metotlar
private
anahtar kelimesi altında tanımlanır ve sadece bu sınıf içinde kullanılır.
private
def normalize_username
self.username = username.downcase if username.present?
enddef set_defaults
self.status ||= STATUS_INACTIVE
enddef generate_authentication_token
self.auth_token = SecureRandom.hex(10)
end
Callback Çalışma Sırası
Önceki makalemde daha detaylı bahsettim ama hatırlatmakta fayda var. Rails’de callback’ler belirli bir sıra takip eder. İşte bu sıralama:
- before_validation: Doğrulama işlemi öncesinde çalışır.
- after_validation: Doğrulama işlemi sonrasında çalışır.
- before_save: Kayıt işlemi öncesinde çalışır (hem
create
hem deupdate
için). - before_create: Oluşturma işlemi öncesinde çalışır (sadece
create
için). - after_create: Oluşturma işlemi sonrasında çalışır (sadece
create
için). - after_save: Kayıt işlemi sonrasında çalışır (hem
create
hem deupdate
için).
Bu sıralama, model üzerinde yapılan işlemlerin belirli bir düzen içinde gerçekleşmesini sağlar ve veri bütünlüğünü korur.
Sonuç olarak;
Ruby on Rails modellerinin doğru bir şekilde yapılandırılması, kodun okunabilirliğini ve bakımını kolaylaştırır. Sabitler, erişimciler, ilişkiler, doğrulamalar, callback’ler, scope’lar, sınıf metotları ve örnek metotların belirli bir sıra içinde yer alması, projelerin daha düzenli ve anlaşılır olmasını sağlar. Rails topluluğunun kabul ettiği bu kurallar, kodun diğer geliştiriciler tarafından daha kolay anlaşılmasını ve kullanılmasını sağlar. Bu yapı ve düzenleme prensiplerini takip ederek, daha sürdürülebilir ve ölçeklenebilir Rails uygulamaları geliştirebilirsiniz.