2011-06-21 23 views
22

, ben aboneleri sadece bir katma sahip kullanıcılar her şeyi miras yapacak nasıl, sadece bir e-posta ve web sitesi alanı var aboneye sahip sadece normal kullanıcılara demek alan?Raylar modeli devralma

cevap

26

Sen tüm alanları içeren bir tablo oluşturmak, hem de bir tür sütun belirtmek gerekir. yani

create_table :users do |t| 
    t.string :email 
    t.string :website 
    t.string :type 
end 

Sonra Kullanıcılar modelden herşeyi devralır

Class User < ActiveRecord::Base 

Class Subscriber < User 

Bir abone gibi sınıflar olabilir. Tür sütunu var, böylece farklı modellerden ayırt edebilirsiniz. Yalnızca 'type' sütunu kullanabilirsiniz olmasaydı o da çok kullanıcıları bulmak gibi aboneleri, alacak

Subscriber.all 

kullanarak Mesela.

+20

OP: Buna "Tek Tablo Kalıtım" veya "STI" denir. Yani Google, ihtiyacınız olduğunda nasıl çalıştığı hakkında daha fazla bilgi için. – Pavling

+4

Konu hakkında biraz araştırma yaptıktan sonra, veriler modellerde farklılık gösterirken bazıları da polimorfik ilişkileri kullanmayı tercih ediyor. Bu, çok sayıda boş alan içeren tek bir tabloya sahip olmayı önler. Bu tren istasyonunu faydalı buldum: http://railscasts.com/episodes/394-sti-and-polymorphic-associations. – rogerkk

+0

Tür sütununda hangi gerçek değer var? –

13

Alex Reisner tarafından bağlantıda açıklanmaktadır single table inheritance, istiyorum. STI, bir temel modelden numaralı modeli birden fazla modeli temsil etmek için tek bir tablo kullanır. Rails dünyasında, veritabanı şemasının, satır tarafından temsil edilen modelin türünü belirten bir sütunu vardır. Bir veritabanı göç type adlı bir sütun ekleme Raylar veri modelindeki adını (class method 'inheritance_column' bakınız) belirtirseniz sütun keyfi bir ad olabilir, ancak tablo, STI kullanır sonucuna sahiptir. Bu, type'u ayrılmış bir sözcük haline getirdiğini unutmayın.

+2

numaralı sütunda abone bozuk. Sanırım doğru bağlantı [http://www.alexreisner.com/code/single-table-inheritance-in-rails](http://www.alexreisner.com/code/single-table-inheritance-in-rails –

+0

Bu bağlantı soruyu yanıtlayabilirken, cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak daha iyidir. Bağlantılı sayfa değiştiğinde yalnızca bağlantı yanıtları geçersiz olabilir. – Luke

+1

@Luke: "Tek tablo devralma" yanıtı olduğu sürece, bu tam olarak yalnızca bağlantı değil. –