Rails: الأمراض المنقولة بالاتصال الجنسي والميراث وإعادة التحميل! خلل في بيئة التنمية

تم إنشاؤها على ٢ يناير ٢٠١٣  ·  3تعليقات  ·  مصدر: rails/rails

أعيد فتح العدد رقم 868 لأنه لا يزال موجودًا حتى اليوم.

لقد استخدمت Ruby-1.9.3-p362 و Rails 3.2.9

الحل الوحيد هو طلب فصول فرعية أو استخدام 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

التعليق الأكثر فائدة

هذا هو القيد المعروف لاستخدام STI في وضع التطوير مع التحميل البطيء للفئات. تحتاج إلى استخدام require_dependency لجعل ريلز على دراية بهذه الفئات الفرعية ، على سبيل المثال:

# app/models/support.rb
class Support < User
end

require_dependency 'administrator'
require_dependency 'employee'

إذا كان لديك الكثير من هذه الفئات الفرعية ، فيمكنك استخدام Dir[] ومجلد خاص في app لتحميلهم جميعًا ، على سبيل المثال:

# app/models/user.rb
class User < ActiveRecord::Base
end

Dir["#{Rails.root}/app/users/*.rb"].each do |file|
  require_dependency file
end

أو البديل الثالث هو ترميز القائمة في Model.descendants ، على سبيل المثال:

# app/models/user.rb
class User < ActiveRecord::Base
  def self.descendants
    [Support, Administrator, Employee]
  end
end

لم أستخدم الأخير شخصيًا ولكن يجب أن يعمل.

ال 3 كومينتر

لقد قمت بإعادة إنتاجه على القضبان 4

القضبان 4.0.0.beta
روبي 1.9.3p194.5

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 []> 

هذا هو القيد المعروف لاستخدام STI في وضع التطوير مع التحميل البطيء للفئات. تحتاج إلى استخدام require_dependency لجعل ريلز على دراية بهذه الفئات الفرعية ، على سبيل المثال:

# app/models/support.rb
class Support < User
end

require_dependency 'administrator'
require_dependency 'employee'

إذا كان لديك الكثير من هذه الفئات الفرعية ، فيمكنك استخدام Dir[] ومجلد خاص في app لتحميلهم جميعًا ، على سبيل المثال:

# app/models/user.rb
class User < ActiveRecord::Base
end

Dir["#{Rails.root}/app/users/*.rb"].each do |file|
  require_dependency file
end

أو البديل الثالث هو ترميز القائمة في Model.descendants ، على سبيل المثال:

# app/models/user.rb
class User < ActiveRecord::Base
  def self.descendants
    [Support, Administrator, Employee]
  end
end

لم أستخدم الأخير شخصيًا ولكن يجب أن يعمل.

لدي هذا النوع من المشاكل ولا يمكنني تشغيله. نماذجي هي A و B (والمزيد) <C و D (والمزيد) <B.
بعد تغيير الرمز ، أحصل على "ثابت B غير مهيأ". حاولت أن تتطلب الاعتماد بطريقتين ، لكن لا أعرف حقًا 1) أي فئة (فئات) تتطلب (B؟) ، و 2) أين تفعل ذلك.
ترتبط هذه النماذج بنماذج أخرى بعدة طرق ، وقد يكون لذلك تأثير على ترتيب التحميل أيضًا (على سبيل المثال A ينتمي إلى X ، X has_many Bs and Cs)

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات