Saya membuka kembali edisi #868 karena masih ada sampai sekarang.
Saya telah menggunakan Ruby-1.9.3-p362 dan Rails 3.2.9
Satu-satunya solusi adalah meminta kelas anak atau menggunakan config.cache_classes = true
> Support.all
=> []
> Employee
=> Employee(id: integer, type: string)
> Administrator
=> Administrator(id: integer, type: string)
> Support.all
=> [#<Administrator id: 1, type: "Administrator">, #<Employee id: 2, type: "Employee">]
Saya telah mereproduksinya di Rails 4
Rel 4.0.0.beta
Ruby 1.9.3p194
1.9.3p194 :001 > Administrator.create
1.9.3p194 :003 > Employee.create
1.9.3p194 :008 > Support.all
Support Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."type" IN ('Support', 'Administrator', 'Employee')
=> #<ActiveRecord::Relation [#<Administrator id: 1, type: "Administrator">, #<Employee id: 2, type: "Employee">]>
1.9.3p194 :009 > reload!
Reloading...
=> true
1.9.3p194 :010 > Support.all
Support Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."type" IN ('Support')
=> #<ActiveRecord::Relation []>
Ini dikenal sebagai batasan penggunaan STI dalam mode pengembangan dengan pemuatan kelas yang malas. Anda perlu menggunakan require_dependency
untuk membuat Rails mengetahui subkelas tersebut, misalnya:
# app/models/support.rb
class Support < User
end
require_dependency 'administrator'
require_dependency 'employee'
Jika Anda memiliki banyak subkelas ini, Anda dapat menggunakan Dir[]
dan folder khusus di app
untuk memuat semuanya, misalnya:
# app/models/user.rb
class User < ActiveRecord::Base
end
Dir["#{Rails.root}/app/users/*.rb"].each do |file|
require_dependency file
end
Atau alternatif ketiga adalah membuat kode keras daftar di Model.descendants
, misalnya:
# app/models/user.rb
class User < ActiveRecord::Base
def self.descendants
[Support, Administrator, Employee]
end
end
Saya belum pernah menggunakan yang terakhir secara pribadi tetapi seharusnya berhasil.
Saya memiliki masalah seperti ini dan tidak bisa membuatnya bekerja. Model saya adalah A, B (dan banyak lagi) < C, D (dan banyak lagi) < B.
Setelah perubahan kode, saya mendapatkan "konstanta B yang tidak diinisialisasi". Mencoba require_dependency dalam beberapa cara, tetapi tidak benar-benar tahu 1) kelas mana yang diperlukan (B?), dan 2) di mana melakukannya.
Model ini terkait dengan model lain dalam beberapa cara, ini mungkin berdampak pada urutan pemuatan juga (misalnya A milik_X, X memiliki_banyak Bs dan Cs)
Komentar yang paling membantu
Ini dikenal sebagai batasan penggunaan STI dalam mode pengembangan dengan pemuatan kelas yang malas. Anda perlu menggunakan
require_dependency
untuk membuat Rails mengetahui subkelas tersebut, misalnya:Jika Anda memiliki banyak subkelas ini, Anda dapat menggunakan
Dir[]
dan folder khusus diapp
untuk memuat semuanya, misalnya:Atau alternatif ketiga adalah membuat kode keras daftar di
Model.descendants
, misalnya:Saya belum pernah menggunakan yang terakhir secara pribadi tetapi seharusnya berhasil.