我想实现一个简单的多态。我的目标是用户,组和其他模型可以共享一个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
。有什么问题?
答案 0 :(得分:2)
这里有几个问题:
identifyable_id
和identifyable_type
。identifyable
和permittable
。belongs_to
)上设置,并由多个父类(has_many
)引用。你有另一种方式不支持它(从建模的角度来看并没有意义)。理解GlobalObject
要完成什么以帮助确定多态关联是否是正确的方法将会有所帮助。但是如果你想使用它们,你需要让GlobalObject
belongs_to可识别(并在那里添加必要的列),或者你需要将它移到User
并添加列那里。