运行rake时“未知密钥:多态”

时间:2013-11-03 01:49:47

标签: ruby-on-rails ruby ruby-on-rails-3.2

我想实现一个简单的多态。我的目标是用户,组和其他模型可以共享一个ID池,因此所有内容都代表GlobalObject。我建造了这样的东西:

    global_object.rb

    生成的
  • $ rails generate scaffold GlobalObject mode:integer

    class GlobalObject < ActiveRecord::Base
      attr_accessible :mode
      has_many :identifyable, :polymorphic => true, :dependent => :destroy
    end
    
  • user.rb

    生成的
  • $ rails generate scaffold User login password

    class User < ActiveRecord::Base
      attr_accessible :login, :password, :salt
      belongs_to :global_object, :as => :permittable
    end
    

组模型将遵循非常相似的结构。我没有修改db文件夹中的迁移文件,只是执行了$ rake db:migrate

  • 20131102224115_create_global_objects.rb

    class CreateGlobalObjects < ActiveRecord::Migration
      def change
        create_table :global_objects do |t|
          t.integer :mode
          t.timestamps
        end
      end
    end
    
  • 20131102224332_create_users.rb

    class CreateUsers < ActiveRecord::Migration
      def change
        create_table :users do |t|
          t.string :login
          t.string :password
          t.timestamps
        end
      end
    end
    

当我执行$ rake时,它会显示两条令人印象深刻的痕迹:

(...)hash/keys.rb:51:in `block in assert_valid_keys': Unknown key: polymorphic (ArgumentError)
    from /Users(...)
    ...

(...)hash/keys.rb:51:in `block in assert_valid_keys': Unknown key: polymorphic (ArgumentError)
    from /Users(...)
    ...

当我删除global_object.rb中的:polymorphic => true时,会出现相同的错误,但代替Unknown key: polymorphic,它会显示Unknown key: as。有什么问题?

1 个答案:

答案 0 :(得分:2)

这里有几个问题:

  • 您缺少迁移中的多态关系列,应该引用identifyable_ididentifyable_type
  • 您指的是不同名称的多态关联 - identifyablepermittable
  • 多态关系意味着在子元素(belongs_to)上设置,并由多个父类(has_many)引用。你有另一种方式不支持它(从建模的角度来看并没有意义)。

理解GlobalObject要完成什么以帮助确定多态关联是否是正确的方法将会有所帮助。但是如果你想使用它们,你需要让GlobalObject belongs_to可识别(并在那里添加必要的列),或者你需要将它移到User并添加列那里。