Rails Best Practice - PostgreSQL'de Kalıcı Adresler

Özet: karmaşık veri türlerini bir SQL veritabanından saklamak ve almak için tutarlı, performanslı ve güvenilir bir yöntem sunan bir çözüm önerin.

Uygulama planlaması, başarılı web uygulamaları oluşturmak için çok önemli ve çoğu zaman göz ardı edilen bir adımdır. Rails çerçevesi, geliştiricilerin planlamadan atlamayı ve geliştirme aşamasına geçmeyi teşvik ettiği bir uygulama oluşturmayı ve önyüklemeyi kolaylaştırır. Bununla birlikte, etki alanını uygun bir şekilde planlamadan önce uygulama kodunun oluşturulması özensiz ve hatta hatalı biçimlendirilmiş uygulamalara yol açabilir. Örneğin, bir uygulamada “adres” alanını işlemek için en iyi yöntemi düşünün.

Adresde ne var?

ABD’de tipik bir adres nasıl görünüyor:

Adres: [
Sokak: “123 Mutlu Günler Şeridi” Dize
Şehir: “Harikalar Diyarı” String
Devlet: “PA” Dize
Posta Kodu: 10102 Dize
]

“Adres” değeri, değerin bir dize olduğu bir anahtar / değer çiftleri dizisinden oluşur. Uygulamalarda görmek çok yaygın bir alandır. Öyleyse, bir SQL veritabanında “Adres” değerini göstermenin en iyi yolu nedir? Bunu anlamak için diğer geliştiricilerin bu durumda ne yaptıklarına bakalım.

Seçenek 1: Değeri, tek bir alanda dizge olarak kaydedin, örneğin:

Adres: “123 Mutlu Günler Ln. Harikalar Diyarı, PA 10102 ”

Bu kötü bir çözümdür. Yukarıdaki bölümde gördüğümüz gibi, bir adres bir anahtar / değer çiftleri dizisidir. Adresi başka bir skaler alan gibi ele almak tutarsız olacaktır. Bu tutarsızlık, uygulamayı gelecekte bir noktada genişletmek istediğimizde ortaya çıkıyor. Diyelim ki tüm müşterileri belirli bir “Şehir” veya “Eyalet” te bulmak istiyoruz. “Adres” değerinin tamamı bir dizginin içinde ezilmiş olduğundan, bunu yapmanın artık kolay bir yolu yoktur.

Seçenek 2: “Adres” değerini farklı alanlara bölün ve bu alanları kaydedin; örneğin:

Sokak: “123 Mutlu Günler”, Şehir: “Harikalar Diyarı”, Eyalet: “PA”, Posta kodu: “10102”

Burada, belirli bir “Şehir” veya “Devlet” in tüm müşterilerini bulmaya ilişkin önceki varsayımsal uzantımızı çözdük. Ancak, şu anda “Adres” alanını, aslında alanların bir araya getirilmesi gerektiğinde dört ayrı ve ayrı alan olarak temsil ediyoruz.

Seçenek 3: Ayrı bir Adres tablosu ve yabancı anahtar ilişkisi oluşturun

Birçok blog yazısı ve StackOverflow cevapları, adresleri Rails'e kaydetmenin en iyi yolunun ayrı bir model ve bir ait olunan bir ilişki kullanmak olduğu sonucuna varıyor. Bu şekilde, bir Kullanıcı veya İşletme modelinin adresleri olabilir ve tek bir adresle sınırlı değildir. Ayrıca, adresler her “Adres” modelinin anahtarlarından ve ilgili değerlerinden oluşacağı gibi uygun şekilde depolanacaktır. Bu, uygulama modelinizin, örneğin “Kullanıcılar” ifadesinin birkaç adres aradığını varsayarsak, kötü bir çözüm değildir. Bununla birlikte, her model sadece bir adrese ihtiyaç duyuyorsa (çoğu insan için olduğu gibi, posta adresi), ek tablolar ve dernekler ekleyerek uygulamanın karmaşıklığını gereksiz yere artırırsınız. Rails'te tablo ve dernek oluşturmak oldukça kolaydır, bu üçüncü seçeneğin arkasındaki nedeni budur. “Kullanıcı” ile doğru ilişkilendirme ile yeni bir “Adres” tablosu oluşturmak şu şekilde basittir: rails g model Adres sokak: string şehir: string state: string zip: string user: referanslar Sonra soru, “bu en iyisidir” Uygulaman için pratik yap, yoksa bu daha karmaşık bir konu için basit bir çözüm mü? ”

Çözüm:

Raylar / PostgreSQL geliştirme ve üretimde kullanılan yaygın bir teknoloji ürünüdür. "Mağaza" uzantısını etkinleştirerek adresleri doğru biçimde depolamak için bir yöntem vardır. Bu uzantı, verileri "hstore" (karma mağaza) türü olarak kaydetmemize olanak sağlar. İlk adım “mağaza” modülünü etkinleştirmek. Bunu yapmak için bir geçiş yazacağız:

'Dils db: göç' komutunu çalıştırdığımız zaman, Postgres ‘hstore’ uzantısını etkinleştirecek. Bu schema.rb dosyasını kontrol ederek doğrulanabilir. Dosyanın en üstüne şimdi görmelisiniz:

 # Bunlar, bu veritabanını desteklemek için etkinleştirilmesi gereken uzantılardır
enable_extension “plpgsql”
enable_extension “hstore”

Sonra, Kullanıcı modeli için bir geçiş oluşturacağız:

Adres alanı için "hstore" veri türünü nasıl kullandığımıza dikkat edin. Bu, anahtar / değer çiftlerini “adres” içinde saklamamızı sağlar.

Bir yana: "Mağaza" alanı, herhangi bir anahtar / değer çiftini saklamak için kullanılabilir. Bu yazıda bir “Adres” i araştırıyoruz ancak “Tercihler” veya başka herhangi bir karma veri türünü depolamak için kullanışlıdır.

Şimdi, bildiğimiz bilgileri City,> “Harikalar Diyarı” ve Eyalet => “PA” şeklinde kaydedebileceğini bildiğimiz tek bir alan var. "Kullanıcı" modelini ve "Kullanıcılar" denetleyicisini oluşturabiliriz, ancak anahtar / değer çiftlerini gerçekten tek bir veritabanı alanına nasıl kaydederiz? Yapılması gereken bir başka husus daha var: City => “Wonderland” anahtar / değer çiftini “adres” alanına nasıl kaldırabiliriz?

Kontrolörün bakış açısından, önce kütlelerin atanabilmesi için herhangi bir parametreyi beyaz listeye almalıyız. Bu, diğer herhangi bir veritabanı alanıyla aynı olan “user_params” özel yönteminde yapılır.

Adres altında nelerin atanabileceğini beyaz listeye alarak, beklediğimiz verilerle ilgili özel talimatlar verdik. Adres alanı bir şehir / değer çiftine veya bir durum / değer çiftine sahip olabilir, ancak bir maymun / değer çiftine sahip olamaz.

Kullanıcı formumuzda, verileri toplamak için uygun alanları sunuyoruz:

Tüm form gösteri için gösterilmiştir. Ancak, adres alanının başlangıcı ve bitişi html yorumlarıyla işaretlenmiştir. Adres yardımcısı için adres alanlarını oluşturmak için nasıl kullandığımıza dikkat edin. Her alan, denetleyicide belirlediğimiz beyaz listedeki bir parametreye karşılık gelir. Bu makaleyle ilgili olmasa da, form Semantic-UI kitaplığındaki sınıflara göre düzenlenmiştir - bu, duyarlı ve harika görüneceği anlamına gelir!

Tarayıcıda görüntülenen formun üstünde

Hızlı bir şekilde bir kullanıcı yaratabilir ve “Adres” alanının nasıl göründüğünü görebiliriz:

Adres alanı, bir anahtar / değer çiftinin toplamı olarak kaydedilir, mükemmel!

Yukarıdaki resimde, “konu” terimi “kullanıcı” ile eş anlamlıdır. Görüldüğü gibi “Adres” alanı anahtar / değer çiftlerimizi beklediğimiz gibi kontrol ünitesinden kurtardı. Belirli bir kullanıcının kullanabileceği bir şehrin değerini bulmak istiyorsak, kullanabileceğimiz @ user.adresi ['şehir'] ve bu, örnek kullanım durumumuzda “Harikalar Diyarı” dır.

Bu yazıda PostgreSQL'deki karmaşık veri tiplerini 'hstore' uzantısı ile kaydetmek ve sorgulamak için en uygun yöntemi keşfettik. En iyi uygulama olarak bir web uygulaması oluşturmanın ilk adımlarının bilgi planlama ve toplama olduğunu belirledik. Ayrıca dokümanları araştırıp okuyarak bilgiyi kendimiz keşfetmenin değerini de öğrendik. Sırf başka bir geliştirici veya şirketin bir yoldan bir şey yapması, kör bir şekilde takip etmemiz gerektiği anlamına gelmez. “Neden” diye sorgulamak ve kendi bilişsel yeteneklerimizi mantıklı bir şekilde sonuç çıkarmak için kullanmak önemlidir. Umarım bu makaleyi yararlı buldunuz. Web teknolojileri hakkında daha fazla ücretsiz bilgi ve öğreticiler için Learn2Code adresini ziyaret edin.