Rails: IMS, warisan dan isi ulang! bug di lingkungan pengembangan

Dibuat pada 2 Jan 2013  ·  3Komentar  ·  Sumber: rails/rails

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">] 
activerecord

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:

# 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.

Semua 3 komentar

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)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat