2008-11-11 16 views
5

Aşağıdaki veri şemasını varsayalım: Bu örnekteRaylarda bileşik bir yabancı anahtar olması mümkün mü?

Usage 
====== 
client_id 
resource 
type 
amount 

Billing 
====== 
client_id 
usage_resource 
usage_type 
rate 

, ben birçok şekilde kullanılabilen her biri birden fazla kaynak, olduğunu varsayalım. Örneğin, bir kaynak bir widget. Widgets, foo ed ve bar ed olabilir. Gizmo s de foo ed ve bar ed olabilir. Bu kullanım türleri, farklı müşteriler için farklı fiyatlarda, hatta farklı oranlarda faturalandırılır. Bir kullanımın (kaynağın) her oluşumu, Kullanım tablosuna kaydedilir. Her faturalama oranı (müşteri, kaynak ve yazı tipi için) fatura tablosunda saklanır.

(bu veriler şema bu sorunu yaklaşım doğru yolu değilse arada, öneri yapın.)

o Ruby Rails ve ActiveRecord kullanarak, mümkün mü, bir has_many ilişki oluşturmak için Faturalandırmalardan Kullanımlara kadar belirli bir faturalandırma oranı için kullanım örnekleri listesini alabilir miyim? Bilmediğim has_many, :through'un bir sözdizimi var mı?

kez daha, yanlış bir açıdan bu sorunu yaklaşırken olabilir, bu nedenle daha iyi bir yol düşünemiyorum eğer, yukarı konuşun!

cevap

6

görünüşte Composite Primary Keys desteği ile Rails'in ActiveRecord uzatmak için sourceforge bir proje var. Bu uzantıyı kullanmadım ama size yardımcı olabilir. Ayrıca rubyforge'da bir mücevher.

sürüm 2.0 olarak raylar üzerinde düz Ruby bileşik birincil anahtarları (bakınız HowToUseLegacySchemas) desteklemez. Her tablonun "id" adında bir tek sütunlu otomatik artış anahtarı olması gerekir.

gördüğüm açıklama şudur: "Eğer eski bir veritabanı kullanmak istiyorsanız sadece bileşik birincil anahtarlar gerekiyor." Bu elbette veri modellemenin gülünç bir cahil görüşüdür.

görüyorum çözüm olacaktır:

  • Usage.client_id -> Client.id
  • Usage.type_id -> Usagetype.id
  • Usage.resource_id -> Resource.id
  • Billing.usage_id -> Usage.id
  • Billing.client_id -> Client.id
  • Billing.type_id -> Usagetype.id
  • Billing.resource_id -> Resource.id

kısmi bilgi tutarlılığını zorlamak için Billing girişimi görünüşte gereksiz yabancı tuşları. Ama oldukça orada almaz - bu değil Faturalandırma tablosundaki referans satırda bulunanlarla eşleşen yanlış istemci/kaynak/usagetype kombinasyonu ile Usage bir satırı başvuru Billing yaratma satırlardan sizi engellemez.

düzenleme: @Yarik: evet, haklısın. Usage için Billing referansı daha mantıklı.

  • Usage.billing_id -> Billing.id

Hmm. Bir ER diyagramı yaptım ama görüntü olarak eklerken sorun yaşıyorum.

+0

ikinci ... diğer olmamalı Bekle yol etrafında - Faturada bir birincil anahtar ve kullanımda bir yabancı anahtar? – Yarik

+0

İyi cevap, iyi bir arka plan. Veritabanlarının RoR görünümü problemli görünüyor. Ancak dbms, RoR'a ağır, ölçeklenemeyen bir veritabanı çenesi olarak itibar etmesini sağlayarak intikamını arttırmış gibi görünüyor. – dkretz

1

Bir geçişte 'execute' komutuyla istediğiniz herhangi bir kısıtlama oluşturabilirsiniz.

Kısıtlama, bir hata attığında durumlarla başa çıkmak için .save'ye bazı hata işleme eklemek isteyebilirsiniz.

Sen fatura kapalı kullanımlarını üretmek için AR yerleşik yöntem jeneratörleri kullanamazsınız ama hala yöntemi olabilir:

class Billing 
    def usages 
    Usage.find(:all, :conditions => ["x = ? and y = ?", self.x, self.y]) 
    end 
end 
İlgili konular