2011-01-19 2 views
0

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

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. Это похоже на хак, хотя ... есть ли способ автоматически указывать рельсы, что это соотношение существует и что настройка 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

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

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

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

+0

хм, хорошо, точка взята. добавление индексов и стирание двунаправленных ассоциаций 'own_to'. Благодарю. – unsorted

+1

* полиморфизм;) – candrews

Смежные вопросы