双向belongs_to(一个多态)

时间:2011-01-19 01:42:09

标签: ruby-on-rails polymorphic-associations

我有两种类,其中一种属于另一种,其中一种多态属于另一种。

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方法,该方法会创建一个tc.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

1 个答案:

答案 0 :(得分:1)

是的,你并不打算做双向belongs_to关联。因此,当你将多态性(实际上是一个单词?)添加到等式中时,它会破坏。

  

关系是belongs_to,因为我希望双向快速访问。我的印象是has_one关系会变慢,因为你必须查询相反的表来搜索匹配的_id。

我不明白你为什么要这样做。如果你真的关心速度,你可以简单地索引belongs_to表上的foreign_key列。速度差应该可以忽略不计。