rails sti и пространство имен дублируют название модели

в моем приложении rails у меня есть такие модели

class Account < ActiveRecord::Base
class Account::Bonus < Account
class Account::Virtual < Account
...more

А вот так

class DiscountSystem  < ActiveRecord::Base
class DiscountSystem::MyFirst < DiscountSystem
class DiscountSystem::MySecond < DiscountSystem

Account and DiscountSystem - модели STI

После этого я хочу, чтобы у DiscountSystem была учетная запись, учетная запись только для DiscountSystem и имя новой модели Account::DiscountSystem

Если я правильно понимаю, «DiscountSystem» для «Учетной записи» находится в пространстве имен «Учетная запись».

их:

class Account::DiscountSystem < Account
  belongs_to :discount_system,class_name: '::DiscountSystem',:foreign_key => :owner_id
end

а также

 class DiscountSystem  < ActiveRecord::Base
   has_one :account, :class_name => 'Account::DiscountSystem',:foreign_key => :owner_id
 end

если я попробую в консоли

>> DiscountSystem::MyFirst.all
LoadError: Expected C:/.../app/models/account/discount_system.rb to define DiscountSystem
>> DiscountSystem.all
NoMethodError: undefined method `all' for DiscountSystem:Module

Почему? Я, вероятно, очень неправильно понял концепцию пространства имен.

Конечно, если я переименую Account::DiscountSystem в Account::ForDiscountSystem, все будет хорошо. Почему имя в пространстве имён Аккаунта "переписывает" корневое имя DiscountSystem?


person BigForceGun    schedule 27.02.2013    source источник


Ответы (2)


Я бы предложил вместо этого использовать class Account::Bonus < Account, а class Bonus < Account. Вы в основном повторяетесь с префиксом Account::, поскольку он уже наследуется от DiscountSystem.

Затем вы также можете удалить параметр class_name в вызове метода belongs_to/has_one.

Это сделает ваш код более понятным и больше соответствует духу Rails.

person harm    schedule 27.02.2013
comment
Я выбрал это решение, потому что аккаунтов уже довольно много — пока больше 10, потому что для каждого типа аккаунта приходится перегружать методы и переменные. Я думал семантически правильный выбор не в %AccountName%, и не в Account %AccountName% - а в naymspace Account::%AccountName% На самом деле в примере Account::Bonus - это придуманные заменители другим сущностям системы, у которых есть учетная запись. Я бы очень хотел для простоты кода добавить в Account имя сущности, которой он является,но при дублировании переменных вылазит эта ошибка. - person BigForceGun; 27.02.2013

Я нашел решение здесь.

Константа верхнего уровня, на которую ссылается предупреждение для модели Mongoid и здесь

https://github.com/rails/rails/issues/6931

require_dependency 'account/discount_system'

class DiscountSystem  < ActiveRecord::Base
...
person BigForceGun    schedule 28.02.2013