Kısacası - hayır şu anda başarmaya çalıştığınız şey için güzel bir temiz STI API'si yok.
Ben aslında yaklaşık bir yıl önce bu a içine baktı ve çeşitli nedenlerden dolayı iyi bir fikir olmadığını bir sonuca vardık:
- Eğer PostgreSQL özgü özellikleri kullanmak istiyorsanız - temelde kendini evleniyorsun o DB'ye. Beni yanlış anlamayın PostgreSQL harika bir DB'dir ve birkaç kez kullandım, ancak bu DB ve uygulama tasarımında sıkışmış olacaksınız.
- Büyük olasılıkla DB'ye özgü özellikleri kullanmaya başlarsanız, bunları manuel olarak (DB üzerinde bir tür komut çalıştırarak veya GUI kullanarak) veya çalıştırırken çalıştırmanız gereken bir tür komut dosyası yazarak bitirirsiniz. db: migrate (uygun test yapmak istiyorsanız bunu yapmanız gerekecektir). Bir süre sonra, hantal ve sinir bozucu olur.
- Eğer daha daha rahatsız olduğunu fark ederseniz, size teklif "acı geniş tabloları ve 'o zaman tip' sütunlar":
- Masanız tasarımı yeniden düşünüldü ve
- Kişisel modellerini yeniden yapılması gerekmektedir STI
- için iyi bir aday olmayabilir. Sadece bununla yaşamak zorundasınız.
Çoğu BT sorunları gerçekten bu kadar inmesi: Benefit vs Çaba. Senin durumunda
kendinize bu soruyu sormalısınız:
- ne kadar zaman sadece ham SQL sorgusu hızlandırır eğer birkaç saniye daha iyi bir STI yapıyı uygulama üzerinde harcamak istiyoruz ? Belki daha açık bir SQL sorgusu yazmak daha iyidir? Çoğu uygulama, gerçekten bir sorun haline geldiği boyutlara ulaşmaz. Ama senin durumunda farklı olabilir.
PS: Ayrıca
uygulamanızda STI yapılandırılmasına ilişkin hızlı bir ipucu: Eğer tüm miras bir ProductCategory, CommentCategory, PhoneCategory, ClientCategory gibi STI kullanmak modelleri bir sürü var olduğunu görürseniz Cateogory'den - Bunları, model dizininin içindeki klasörlerde düzenlemeye eğilimliyim. Sonra application.rb içinde sadece bir satır ekleyin: config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/**}')]
"Hepimiz biliyoruz ki rayların STI'sı (tekli tablo devralma), karmaşık bir veri modeline ve alt veritabanı veritabanına yol açtığı için icky." --- Bu önermeyi kabul etmiyorum. –
Tamam belki de bu bir genelleme olabilir .. Ama çocuk modellerinizin diğer çocuklara uygulanmayan çok fazla özelliği olmadığı zaman sadece iyi bir fikir olma eğilimindedir. Aksi halde büyük çaplı geniş masalarla sonuçlanırsınız. null sütunlar. Bir raylar perspektifinden tamam olabilir, ancak veritabanında ham SQL'i çalıştırırken çok çirkin olabilir, belki de PostgreSQL'in mirası daha hızlı değil ama en azından benden uzak durur! : P –
Postgres'in mirasları o kadar kusursuz bir şekilde uyuyorsa, sadece bir "tip" sütununun yeterince iyi olacağını düşünmüyorum. Miras ile gördüğüm kadarıyla, 'SELECT *' tüm ilişkili sütunları döndürür (ve ben de tüm ilişkisiz sütunları tahmin ediyorum:/... Ama DB yapınız daha temiz olurdu. – stuartc