ben

OMÜ , Bilgisayar Mühendisliği, 13'

3 Şubat 2016 Çarşamba

keep_if delete_if

   Modelden cektiğimiz verilerin sorgulanması için active resource yapısını kullanıyoruz. Örneğin category ve lesson  modellerimiz has_many ile birbirine bağlı olduğunda Category.first.lessons olarak gidebiliriz


Bu sorgumuza where kosulu ekleyelım:

Category.first.lessons.where(name: "rails")



koşulumuz sağlandı fakat getirilen veriler lesson modelinde, şunu isteyebilirim:
dersin adının lesson olan verilerin category adını alalım desem;

  Category.first.lessons.where(name: "rails").first.category.name


istenileni verdi fakat lesson modelinede user modelini bağlasak user model,nede bağlı contact tablosundan city alnını "samsun" olsun diye bi şart daha eklesek bu sefer gösterilcek veri category de sart kosullar farklı birbirine bağlı üç tabloda

bu sorunun karsılıgı sql de in select le cok basit yapılabilir bağlı tüm tablolardan birbirine gecebilir kosullar verilebilir. railscesi bunun biraz farklı, birden fazla modellerle karısık bir sorgu yapmam gerekti ve karşıma keep_if diye bir method cıktı.

önce basit bir array de bir iki deneyelim nasılmış?

@array=[[42, "Konya"], [17, "Çanakkale"], [55, "Samsun"], [34, "İstanbul"], [6, "Ankara"]]
@array.keep_if{|x| x[0]>40}

@array.keep_if{|x| x[0]>40}.map{|a| a[1]} 

 arraylerde bu şekilde koşul verebiliyoruz. gösterilecek alanı de map ile kısıtlayabiliyoruz

Railse bunu nasıl aktarabiliriz. öncelikle keep_if ile sorgulayacağımız modeli array turune dönüştürmek gerekiyor(.to_a)

bağlantıları
category has_many lesson
lesson has_many user
user has_one contact

sorgumuz:

yazılım kategorisinde kayıtlı olan öğrencilerden sehir bilgisi "samsun" olanların kayıtlı olduğu dersleri getirelim.

Active search la bu biraz karmasık belki bir yolu vardır fakat ben bulamadım. keep_ifle yapalım

Categor.find_by_name("yazılım").lessons.includes(user: [:contact]).to_a.keep_if{|p| p.user.contact.city=="Samsun"}.map{|x| x.id}


En sondaki map ile belirttiğimiz x hangi modeli verir bize?

userdan contact modelinden sorgulama yaptıktan sonra bu şartı sağlayan lessonları verir. keep_ifin önünde hangi model varsa o modelin yada ona bağlı olan modellerde sorgulama yapar ve liste içerisinde şartı sağlayanları verir.

dikkat edilecek bir husus daha var bize getirilen veri array türünde, active resource türünde değil.

@lessons_arry diye bir değişkene aldık diyelim gelen verileri

@lessons_arry.each do |lesson|
        lesson.user.name
end

bu şekilde active resource ile gidemeyiz. 

-@lessons_ac= Lesson.where('id in (?)',@lessons_arry)

bu şekilde  rails model türüne dönüştürebiliriz.


Birde delete_if imiz var burdada koşulu sağlamayanları siler

@array.delete_if{|x| x[0]>50}

Hiç yorum yok: