Rails – Gelişmiş Aramalar

Daha önceki yazılarda “find” metodunu örneklerle kullanmıştım. Bu yazıda ise “where” metodundan bahsedeceğim.

where Metodu ile Arama

where metodu” ile kullanacağımız arama şartlarını hash syntaxı ile yazabiliriz. Bu sözdizimi yani hash olarak yazdığınız şartlar yalnızca direk sağlandığında kullanışlıdır. Yani şartın direk eşleşmesi beklenir, SQL’deki like sorguları gibi benzerlik durumlarını içermez.

SQL Cümlelerinin Kullanımı

where” metodu ile birlikte daha karmaşık sorgular yapabilmek için SQL sorgularından yararlanabiliriz. Örneğin biraz önce “profile” üzerinde yaptığımız aramayı şimdi düz SQL sorgusu ile yapalım:

Daha karmaşık SQL sorgularıda yazabilirdik:

Bu şekilde SQL sorgularının doğrudan yazıldığı where metodları uygulama içerisinde kesinlikle kullanılmamalıdır! Aksi halde Rails uygulamanız SQL Injection saldırılarına maruz kalabilir. Konuya ilgi duyanlar devam etmeden önce şunları okuyabilir:

Şart Dizilerinin Kullanımı

Uygulamanızın SQL injection saldırılarına maruz kalmamasını istiyorsanız, SQL sorgularınızı şart dizileri halinde yazmalısınız. Örneğin bugünden önce oluşturulmuş “user“ları bulalım:

Burada “?” karakterini placeholder olarak kullandık, metodumuz ise çalıştırılırken ikinci argümanı alarak “?” karakterinin olduğu yere koyacağını zaten biliyordu. Bu uygulamayı Python programlama dilinde ki “%s” karakterine, yani string placeholder’ına benzetebilirsiniz.

Yazdığınız koşulun çalıştırıldığında SQL olarak neye benzeyeceğini incelemek için “to_sql” metodunu kullanabilirsiniz:

Şimdi ise sorgu dizimize birden çok argüman paslamayı deneyelim ve hatta biraz önce yazdığımız ve güvenlik zaafiyeti olan sorguyu tekrar yazalım:

Güvensiz Sorgu:
Güvenli Sorgu:

Active Record – Arama Metodları

Metod Örnek
where(arama_şartları) Profile.where(“created_at > ? AND name like ?”, ‘2013-01-01’, ‘%Serhat%’)
order Article.order(“title DESC”)
limit Profile.limit(10)
joins Profile.joins(:comments)

  • İlişkili tabloların sorguya (SQL JOIN sorgusunda olduğu gibi) dahil edilmesi için.
includes Profile.includes(:comments)

  • İlişkili tabloların sorguya (SQL JOIN sorgusunda olduğu gibi) dahil edilmesi ve Active Record nesneleri olarak döndürülmesi için.

Bu metodların hepsini birbirine bağlayarakta kullanabiliriz:

Default Scope

Rails uygulamalarında sıkça kullandığımız “find işlemleri üzerinde tanımlamalar yapmak için “scope“ları kullanabiliriz.

Şuan uygulamamızda Category modelinin tüm nesnelerini çağırdığımızda bunların default olarak id’lerine göre sıralandığını görebilirsiniz:

Category’leri alfabetik olarak isimlerine göre sıralamak için “default_scope” kullanabiliriz:

Tekrar deneyelim:

Named Scope

default_scope“a ekleyeceğimiz durumlar, her zaman ve her koşulda uygulanacağı için bazen kullanışlı olmayabilirler. Sıklıkla kullandığımız sorgular için “named scope“lar oluşturmak bazı durumlarda daha kullanışlıdır. Örneğin yayınlanmış olan article’ları temsilen “published“, henüz yayınlamamış olanları temsilen ise “draft” isimli scope’ları oluşturalım:

Yukarıdaki örnekte “where” metodunu diğer metodlardan bağımsız ve tek başına kullandık. Ancak arama metodlarını başka named scope’lar ilede birbirine bağlayabilirdik. Örneğin “recent” isiminde bir scope oluşturalım ve bu scope bize son 1 hafta içerisinde paylaşılmış olan article‘ları versin ancak bunu yaparken öncelikle bu article‘ların “published” durumda olup olmadığına – published scope’undan bakarak karar versin.

Burada scope’ları birbirine nasıl bağladığımıza dikkat edin:

  • lambda’lar standalone metodları tanımlayan anahtar kelimelerdir. Bu metodlar yalnızca siz onları çağırdığınızda çalışırlar.

Şu ana kadar hazırladığımız scope’lar, yalnızca bizim verdiğimiz sorguları uyguluyor ve kullanıcıyla etkileşime geçmiyorlar. Yani hard-coded olarak yazılmış durumdalar. Şimdi, kullanıcıların “title“a göre arama yapabilmelerine yardımcı olan “where_title” scope’unu hazırlayalım:

Daha yakından bakacak olursak:

Hazırladığımız scope’ları test edelim:

Devam edecek.

Leave a Reply