Rails: ИППП, наслСдство ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°! ошибка Π² срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 2 янв. 2013  Β·  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">] 

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π­Ρ‚ΠΎ извСстноС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ использования STI Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ с ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ классов. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ require_dependency Ρ‡Ρ‚ΠΎΠ±Ρ‹ Rails Π·Π½Π°Π» ΠΎΠ± этих подклассах, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

# 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

Rails 4.0.0.beta
Π ΡƒΠ±ΠΈΠ½ 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 Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ с ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ классов. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ require_dependency Ρ‡Ρ‚ΠΎΠ±Ρ‹ Rails Π·Π½Π°Π» ΠΎΠ± этих подклассах, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

# 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 has_many Bs ΠΈ Cs)

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ