двунаправленная принадлежность (одна полиморфная) - PullRequest
0 голосов
/ 19 января 2011

У меня есть два вида классов, один из которых принадлежит_ другому, а другой - полиморфно, принадлежит другому виду.

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

Отношения принадлежат_, потому что я хочу быстрый доступ в обоих направлениях.,У меня сложилось впечатление, что отношение has_one будет медленнее, потому что вам придется запросить противоположную таблицу для поиска подходящего _id.

Прямо сейчас, когда я создаю курс cЯ запускаю метод after_save, который создает термин t такой, что c.term = t и t.reference = c.Это похоже на взлом ... хотя есть ли способ автоматически сообщить rails, что эта связь существует и что установка c.term = t должна автоматически сделать t.reference = c?

Я знаю, что с полиморфными ассоциациями вы можетеукажите атрибут :as (см. API ), но похоже, что это не работает для принадлежащим.

  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 Ответ

1 голос
/ 19 января 2011

Да, вы не должны делать двунаправленные belongs_to ассоциации.Таким образом, когда вы добавляете полиморфность (это действительно слово?) В уравнение, оно нарушается.

Отношения принадлежат_, потому что я хочу быстрый доступ в обоих направлениях.У меня сложилось впечатление, что отношение has_one будет медленнее, потому что вам придется запросить противоположную таблицу, чтобы найти соответствующий _id.

Я не понимаю, зачем вам это нужноэтот.Если вы действительно обеспокоены скоростью, вы можете просто проиндексировать столбец (и) foreign_key в таблице, которая belongs_to.Разница в скорости должна быть незначительной.

...