在我的项目中,我需要User
能够“创建/拥有”自己的对象和“跟踪”(或“跟随”)其他用户创建的对象。这是我的方法:
class User < ActiveRecord::Base
has_many :widgets
has_many :gadgets
has_many :nuggets
has_many :tracks
has_many :tracked_widgets, :as => :trackable, :trackable_type => "Widget"
has_many :tracked_gadgets, :as => :trackable, :trackable_type => "Gadget"
has_many :tracked_nuggets, :as => :trackable, :trackable_type => "Nugget"
end
class Track < ActiveRecord::Base
belongs_to :trackable, polymorphic: true
belongs_to :user
end
class Widget < ActiveRecord::Base # Gadget and Nugget classes are the same
has_many :tracks, :as => :trackable
end
表的架构tracks
:
create_table "tracks", :force => true do |t|
t.integer "user_id"
t.integer "trackable_id"
t.string "trackable_type"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "tracks", ["trackable_id", "user_id"], :name => "index_tracks_on_trackable_id_and_user_id"
使用此实现,我收到以下错误:
Unknown key: trackable_type (ArgumentError)
查看架构,很明显我没有:trackable_type
设置为索引,因此错误消息是有道理的。但是,在我看到的演示多态关系的示例中,我从未见过将______able_type
字段设置为索引。这让我想知道我是否在这里遗漏了一些基本的东西。我有这些问题:
- 我是否以某种方式错误地设置了
has_many
和:as => :trackable
关系? - 如果没有,使用
string
字段作为有什么问题index
吗? - 如果答案只是将
:trackable_type
字段添加为索引,那么事后最好的方法是什么?添加一个新的迁移来创建:trackable_type
index
?