Ruby on rails &引用;未知密钥:多态性“;在运行耙子时

Ruby on rails &引用;未知密钥:多态性“;在运行耙子时,ruby-on-rails,ruby,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3.2,我想实现一个简单的变形。我的目标是,用户、组和其他模型可以共享一个ID池,以便所有内容都表示一个GlobalObject。我建造了这样的东西: global\u object.rb由$rails生成scaffold GlobalObject模式:integer: class GlobalObject < ActiveRecord::Base attr_accessible :mode has_many :identifyable, :polymorphic => true,

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

  • global\u object.rb
    $rails生成scaffold GlobalObject模式:integer

    class GlobalObject < ActiveRecord::Base
      attr_accessible :mode
      has_many :identifyable, :polymorphic => true, :dependent => :destroy
    end
    
一个群体模型将遵循一个非常相似的结构。我没有修改db文件夹中的迁移文件,只是执行了
$rake db:migrate

  • 20131102224115\u创建\u全局\u对象。rb

    class CreateGlobalObjects < ActiveRecord::Migration
      def change
        create_table :global_objects do |t|
          t.integer :mode
          t.timestamps
        end
      end
    end
    
    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
时,也会出现相同的错误,但它不是说
未知键:polymorphic
,而是说
未知键:as
。怎么了?

这里有几个问题:

  • 迁移中缺少多态关系列,这些列应该引用
    identifiable\u id
    identifiable\u type
  • 您使用不同的名称引用多态关联-
    identifiable
    permitable
  • 多态关系是指在子元素(
    属于
    )上设置,并由多个父类(
    有许多
    )引用。另一种方法是不受支持的(从建模的角度来看,这是没有意义的)

了解
GlobalObject
要完成什么,有助于确定多态关联是否是正确的方法,这将很有帮助。但是如果你想使用它们,你要么需要使一个
GlobalObject
属于可识别的(并在那里添加必要的列),要么需要将它移动到
用户那里并在那里添加列。

至少你应该指出你的类名,因为我没有看到任何可识别的类。应该是
有很多:可识别,:class\u name=>'User',:polymorphic=>true,
@zishe:多态关系的关键是它不必与特定的类相关……好吧,很抱歉误解=)从外观上看,多态性可能不是你真正想要的。如果您想向所有模型添加通用功能,您可以创建一个
模块
并在每个模型中包含它。然后我必须向GlobalObject迁移添加
可识别id
可识别类型
,对吗?因为GlobalObject可以有多个用户,但一个用户只能有一个GlobalObject。稍后也可能有一个组有一个GlobalObject,但GlobalObject可以有许多用户和组。这三点都正确。我99%确定抛出了错误,因为
:多态性
不是
的选项,它有很多
-只是
的一个选项属于
@Tygaz:不,这是不正确的。支持多态关联的实体必须使用
归属
声明来定义关联。这意味着
GlobalObject
在设置时不能有很多用户。@Tygaz听起来你不需要多态性。只需在用户模型和组模型上有一个全局对象id字段。然后:用户属于全局对象,组属于全局对象,gobal对象有很多用户和组。啊,对了!现在我明白了。我交换了
所属的
,并且
在文件中有许多
,更正了
:permitable
(多么愚蠢,感谢您注意到^^'),添加了id和类型,重新迁移,现在它可以工作了。非常感谢:)@tybro好吧。。。这听起来不错。我想,你是对的。我来测试一下;)
(...)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(...)
    ...