Rails: 성병, 상속 및 재μž₯μ „! 개발 ν™˜κ²½μ˜ 버그

에 λ§Œλ“  2013λ…„ 01μ›” 02일  Β·  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λ₯Ό μ‚¬μš©ν•˜λŠ” μ•Œλ €μ§„ μ œν•œ μ‚¬ν•­μž…λ‹ˆλ‹€. Railsκ°€ μ΄λŸ¬ν•œ ν•˜μœ„ 클래슀λ₯Ό μΈμ‹ν•˜λ„λ‘ ν•˜λ €λ©΄ 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.베타
루비 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 []> 

이것은 클래슀의 지연 λ‘œλ“œμ™€ ν•¨κ»˜ 개발 λͺ¨λ“œμ—μ„œ STIλ₯Ό μ‚¬μš©ν•˜λŠ” μ•Œλ €μ§„ μ œν•œ μ‚¬ν•­μž…λ‹ˆλ‹€. Railsκ°€ μ΄λŸ¬ν•œ ν•˜μœ„ 클래슀λ₯Ό μΈμ‹ν•˜λ„λ‘ ν•˜λ €λ©΄ 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"κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€. λͺ‡ 가지 λ°©λ²•μœΌλ‘œ require_dependencyλ₯Ό μ‹œλ„ν–ˆμ§€λ§Œ 1) μ–΄λ–€ 클래슀(λ“€)이 ν•„μš”ν•œμ§€(B?), 2) μ–΄λ””μ„œ ν•΄μ•Ό ν•˜λŠ”μ§€ λͺ¨λ¦…λ‹ˆλ‹€.
μ΄λŸ¬ν•œ λͺ¨λΈμ€ μ—¬λŸ¬ 가지 λ°©μ‹μœΌλ‘œ λ‹€λ₯Έ λͺ¨λΈκ³Ό μ—°κ²°λ˜λ©°, μ΄λŠ” λ‘œλ“œ μˆœμ„œμ—λ„ 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€(예: Aκ°€ X에, X에 B 및 Cκ°€ 많이 있음).

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰