1

Railsアプリケーションで、EmployeeモデルとNetworkDriveモデルの間にhas_and_belongs_to_many関係を設定しようとしています。

employee.rbで指定しました

has_and_belongs_to_many :network_drives</code>

およびnetwork_drive.rb..。

has_and_belongs_to_many :employee</code>

ただし、「:network_drive_ids」ではなく「:network_drife_ids」のようなモデル属性を生成しているようです。これにより、次のようなエラーが発生します。

uninitialized constant Employee::NetworkDrife

モデルがNetworkDrifeではなくNetworkDriveと呼ばれていることを考えると、これは正確です。

これが繰り返しの質問である場合は申し訳ありませんが、この問題を検索する方法がわかりませんでした。私はここでHABTMの関係についての質問によって提供されたいくつかの解決策を試しましたが、役に立ちませんでした。

更新:has_many:throughリレーションシップに変更しようとした後のエラー全体は次のとおりです。

NameError: uninitialized constant EmployeeItRequest::EmployeeItRequestDrife
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.7/lib/active_record/inheritance.rb:111:in `compute_type'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.7/lib/active_record/reflection.rb:172:in `klass'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.7/lib/active_record/reflection.rb:216:in `association_primary_key'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.7/lib/active_record/associations/has_many_association.rb:104:in `foreign_key_present?'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.7/lib/active_record/associations/association.rb:165:in `find_target?'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.7/lib/active_record/associations/collection_association.rb:332:in `load_target'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.7/lib/active_record/associations/collection_proxy.rb:44:in `load_target'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.7/lib/active_record/associations/collection_proxy.rb:87:in `method_missing'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.7/lib/rails/commands/console.rb:47:in `start'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.7/lib/rails/commands/console.rb:8:in `start'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.7/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

更新:NetworkDrive.tableizeの結果

NoMethodError: undefined method `tableize' for #<Class:0x0000000229fef8>
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/activerecord-3.2.7/lib/active_record/dynamic_matchers.rb:50:in `method_missing'
    from (irb):1
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.7/lib/rails/commands/console.rb:47:in `start'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.7/lib/rails/commands/console.rb:8:in `start'
    from /usr/local/rvm/gems/ruby-1.9.2-p320/gems/railties-3.2.7/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
4

1 に答える 1

7

これはHABTMの問題ではありませんが、レールに組み込まれている屈折規則の1つであり、の代わりにdrives単数に変換されます。drifedrive

コンソールの場合:

"drives".singularize  # => "drife"

語尾変化ルールを追加することで、デフォルトの形式を上書きできます。

initializers / inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
  inflect.clear :inflection_drives
  inflect.irregular 'network_drive', 'network_drives'
end
于 2012-08-29T20:55:28.637 に答える