2016-05-21 16 views
27

Rails 5'in ApplicationRecord modelimizi (ActiveRecord) devraldığı soyut bir sınıf olarak eklediğini biliyoruz.Neden Raylar 5 ActiveRecord :: Base yerine ApplicationRecord kullanır?

Ancak, temel olarak, ApplicationRecord ile yaptığımız her teknik gereksinimi, ActiveRecord::Base ile de yapabiliriz. Örneğin:

module MyFeatures 
    def do_something 
    puts "Doing something" 
    end 
end 

class ApplicationRecord < ActiveRecord::Base 
    include MyFeatures 
    self.abstract_class = true 
end 

Yani artık her modeli MyFeatures davranışlarını eklenecektir. Ama aynı zamanda Raylar 4'te bunu başarabilirsiniz:

ActiveRecord::Base.include(MyFeatures) 

Yani ApplicationRecord kullanmanın faydası nedir, bunu ApplicationRecord eklemek gerekli olduğunu düşünüyorsunuz?

cevap

35

Temel Raylar uygulamalarında aynı görünebilir olsa da, raylar motorları, eklentileri/taşlar veya ActiveRecord::Base gelen doğrudan yöntemler kullanmaya başladığınızda aslında önemli bir fark var.

  • ActiveRecord::Base.include(MyFeatures) doğrudan ActiveRecord::Base içine özellikleri karışımları ve (o "tek cins" olamaz) sonsuza ActiveRecord::Base tüm sonraki kullanımlar için orada mevcut olan ve sonrasında herhangi bir kod artık orijinal ActiveRecord::Base almak için bir yolu yoktur içerir. Karma özelliklerin bir kısmı varsayılan ActiveRecord davranışını değiştirdiyse ya da ör. iki motor/taşlar aynı adlı yöntemleri dahil etmeye çalıştı.

    Öte yandan
  • , ApplicationRecord yaklaşım sadece ondan, diğer sınıfları yanı sıra ActiveRecord::Base doğrudan kullanımını devralan sınıflar (modeller) için mevcut özellikler modül özellikleri tarafından düzenli, tertemiz kalmak yapar. onları ApplicationRecord önce mümkün değildi ana uygulamanın modeli mantıktan kendi modeli mantığı ayırmak için izin verdiği motorları veya raylar eklentileri kullanıldığında

bu özellikle önemlidir.

Tüm bunlar ayrıca this blog post ve this github comment'da da açıklanmıştır.

+1

'ActiveRecord :: Base' uzatan her bir mücevher, bunun sonucunda kırılacak mı?Eğer öyleyse, devasa bir miktar bakım ve teknik borç oluşuyor. – Kelseydh

4

Bu, BoraMa'nın yanıtını genişletmek ve umarım, ActiveRecord::Base.abstract_class civarında bir karışıklık ortaya çıkarmaktır. http://api.rubyonrails.org/v4.0.0/classes/ActiveRecord/Inheritance/ClassMethods.html

Yani, herkese düşünür:

ActiveRecord::Base.abstract_class

Raylar 4.0.0 2012. belgelere geliştirilmiş, 20 Ocak tarihinde yayınlandıktan en az Raylar 3.2.0 (http://api.rubyonrails.org/v3.2.0/classes/ActiveRecord/Inheritance/ClassMethods.html), geri döner ApplicationRecord tamamen yeni, değil. Bu bir gelişme, kırılma değil. Bu işi yapmak için hiçbir şey ActiveRecord::Base'a eklenmiştir.

Aynı şey bir Rails 4.2.6 projesinde de yaptım çünkü modeller tamsayılar yerine kimlikler için UUID kullanıyordu ve bu, varsayılan ORDER BY için bir değişiklik gerektirdi. Yani, kopyala yapıştır veya bir endişe kullanmak yerine, UuidModel sınıfını ve self.abstract_class = true'u kullanarak devralmaya gittim.

+0

Rails 2.x'teki abstract_class'ı hatırlıyorum. – skalee

İlgili konular