1

私の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

アカウントと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にするのはなぜですか?

4

2 に答える 2

0

class Account::Bonus < Account使用せず、代わりに使用することをお勧めしclass Bonus < Accountます。Account::プレフィックスはDiscountSystemから既に継承されているため、基本的にはプレフィックスを繰り返します。

次に、 /メソッド呼び出しclass_nameでパラメータを削除することもできます。belongs_tohas_one

これを行うと、コードが理解しやすくなり、Railsの精神に沿ったものになります。

于 2013-02-27T10:05:03.733 に答える
0

ここで解決策を見つけました。

Mongoidモデルの警告 とここで参照されるトップレベルの定数

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

require_dependency 'account/discount_system'

class DiscountSystem  < ActiveRecord::Base
...
于 2013-02-28T11:16:19.420 に答える