Skip to content
This repository has been archived by the owner on Jun 16, 2021. It is now read-only.

Latest commit

 

History

History
106 lines (87 loc) · 2.83 KB

collection.md

File metadata and controls

106 lines (87 loc) · 2.83 KB
author(s)
Recai Oktaş (@roktas)

Collection

Bu sınıf özellikle YAML gibi bir kaynaktan okunan tek seviyeli sözlük türünde basit veri elemanlarıyla çalışırken kullanabileceğiniz bir delegatördür. Özellikle Structure modülüyle birlikte etkili bir ikili oluşturur. Üzerinde çalıştığınız problemde basitçe tekil/çoğul kalıplarıyla karşılaşmışsanız, ör. FalanFilan ve FalanFilans (ehmm, FalanFilanlar), basit durumlarda bu ikiliyi kullanmayı deneyebilirsiniz.

Aşağıdaki YAML içeriğini göz önüne alalım:

- name: Mühendislik Fakültesi
  abbreviation: MÜHENDİSLİK
  yoksis_id: 122183
  unit_type_id: Fakülte

- name: Bilgisayar Mühendisliği Bölümü
  abbreviation: BİLGİSAYAR
  yoksis_id: 122184
  unit_type_id: Bölüm

Bu örnekte (Structure örneğini hatırlarsak) Unit nesneleri yani Units var.

class Unit
  class_attribute :units, default: []

  include Structure.of %i[
    name
    abbreviation
    yoksis_id
    unit_type_id
  ]

  def faculty?
    unit_type_id == 'Fakülte'
  end
end

class Units < Collection
  def list_by_unit_type_id(unit_type_id)
    select { |unit| unit.unit_type_id == unit_type_id }
  end
end

units = Units.create [
  {
    'name' => 'Mühendislik Fakültesi',
    'abbreviation' => 'MÜHENDİSLİK',
    'yoksis_id' => '122183',
    'unit_type_id' => 'Fakülte'
  },
  {
    'name' => 'Bilgisayar Mühendisliği Bölümü',
    'abbreviation' => 'BİLGİSAYAR',
    'yoksis_id' => '122184',
    'unit_type_id' => 'Bölüm'
  }
]

units.list_by_unit_type_id('Fakülte').size #=> 1

Collection sınıfından miras alan çocuk sınıflar siz açıkça belirtmediğiniz sürece kolleksiyonda yer alan nesnelerin sınıfını otomatik olarak seçer. Örneğin Units < Collection sınıfı kolleksiyonda yer alan nesnelerin Units isminin tekil hali olan Unit olduğunu biliyor. Eğer otomatik çözümlemeyi istemiyorsanız veya (sınıf adınının uygun koşullarda olmamasından dolayı) işinizi görmüyorsa collection.collects atamasıyla koleksiyon nesnelerinin hangi sınıfta beklendiğini söyleyebilirsiniz.

class Departments < Collection
  collection.collects = Unit

  def list_by_unit_type_id(unit_type_id)
    select { |unit| unit.unit_type_id == unit_type_id }
  end
end

Örnekte görülen collection sınıf niteliği sınıf düzeyinde anlamlı parametreleri (collects dışında) kaydedebileceğiniz bir ActiveSupport::OrderedOptions nesnesi.

class Foo < Collection
  collection.used = true
end

Foo.collection.used #=> true

Bu örnekte birimleri sınıflamak için özel bir list_by_unit_type_id metodu yazılmıştır. Amacınız bu tür sınıflamalar yapmak ve kolleksiyonda tekrarlı elemanlardan kaçınmak ise Collection yerine UniqCollection sınıfını tercih edin.