3

我想实现一个简单的多态。我的目标是用户、组和其他模型可以共享一个 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(...)
    ...

当我删除:polymorphic => trueglobal_object.rb 中的时,会发生相同的错误,但Unknown key: polymorphic它不是 ,而是Unknown key: as。怎么了?

4

1 回答 1

3

这里有几个问题:

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

了解 aGlobalObject的含义有助于确定多态关联是否是此处的正确方法。但是如果你想使用它们,你要么需要使一个GlobalObjectbelong_to 可识别(并在那里添加必要的列),要么你需要将它移动到User那里并在那里添加列。

于 2013-11-03T02:09:11.587 回答