2011-02-17 22 views
17

Test amacıyla soyut AR sınıfının bir nesnesini oluşturmaya çalışıyorum. Böyle tanımlanan modeli en: Ben Basic.new çalıştığınızdaRaylar 3 ActiveRecord özet nesneleri

class Basic < ActiveRecord::Base 
    self.abstract_class = true 

    def stuff 
    raise NotImplementedError 
    end 
end 

, alıyorum:

"Mysql2::Error: Table 'project_development.basics' doesn't exist" 

normal davranış mı? Soyut AR sınıflarının, (açıkça imkansız) bir sebat olmaksızın bile gerçekleştirilmesi amaçlanmamış mıdır?

Raylar ile 1.9.2-P136 kullanılarak 3.0.4/Mysql2 0.2.6

Düzenleme:

Bu hata, sütun tanımları neden olduğu ortaya çıktı, bir durumunda da, soyut model veritabanından alınamaz.

class Basic < ActiveRecord::Base 
    self.abstract_class = true 
    @columns = [] 
end 

Bir çekicilik gibi çalışır.

+0

Yakut programcılar soyut sınıflardan hoşlanmazlar. Modüller dahil size uygun değil mi? http://stackoverflow.com/questions/512466/how-to-implement-an-abstract-class-in-ruby – tokland

+2

@tokland; Gerçekten mi? Buna katılmam gerek. Soyut sınıflar çok faydalıdır ve sıklıkla kullanılır. ActiveRecord :: Base' örneğin soyut bir sınıftır. Yine de, bazı insanların soyut sınıfları kullanma şeklinin, modülleri kullanarak daha iyi sunulabileceğini kabul ediyorum. – idlefingers

+0

@idlefingers. Özür dilerim, bu çok cesur bir ifadeydi, aslında soyut sınıflar bazı senaryolarda yararlı olabilir. – tokland

cevap

20

Bu normal bir davranıştır. Soyut sınıfların somutlaştırılmaması gerekir. Soyut sınıfın kendisinden değil soyut sınıftan miras kalan sınıfları test etmelisiniz.

+0

+1, bu birçok dinamik dilde normaldir. İlgili: http://stackoverflow.com/questions/4619941/simulating-abstract-classes-in-ruby-rails – tokland

İlgili konular