我有两种类,其中一种属于另一种,其中一种多态属于另一种。
class Term < ActiveRecord::Base
belongs_to :reference, :polymorphic => true
end
class Course < ActiveRecord::Base
belongs_to :term
end
class Career < ActiveRecord::Base
belongs_to :term
end
关系是belongs_to,因为我希望双向快速访问。我的印象是has_one
关系会变慢,因为您必须查询相反的表格才能搜索匹配的_id
。
现在,当我创建课程c
时,我运行了一个after_save方法,该方法会创建一个t
和c.term = t
的术语t.reference = c
。这看起来像是一种黑客...有没有办法自动告诉我们这种关系存在并且设置c.term = t
应该自动生成t.reference = c
?
我知道,通过多态关联,您可以指定:as
属性(请参阅API),但看起来这对belongs_to不起作用。
class Asset < ActiveRecord::Base
belongs_to :attachable, :polymorphic => true
def attachable_type=(sType)
super(sType.to_s.classify.constantize.base_class.to_s)
end
end
class Post < ActiveRecord::Base
# because we store "Post" in attachable_type now :dependent => :destroy will work
has_many :assets, :as => :attachable, :dependent => :destroy
end
答案 0 :(得分:1)
是的,你并不打算做双向belongs_to
关联。因此,当你将多态性(实际上是一个单词?)添加到等式中时,它会破坏。
关系是belongs_to,因为我希望双向快速访问。我的印象是has_one关系会变慢,因为你必须查询相反的表来搜索匹配的_id。
我不明白你为什么要这样做。如果你真的关心速度,你可以简单地索引belongs_to
表上的foreign_key列。速度差应该可以忽略不计。