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