Рельсы полиморфные has_many: через - PullRequest
15 голосов
/ 09 января 2011

Я извлекаю некоторые данные из внешнего API и хотел бы кэшировать результаты локально. У меня есть class SearchTerm, который я хотел бы связать с несколькими различными типами ActiveRecord через таблицу searchable_items. Я почти уверен, что таблицы настроены правильно, но что-то в моих ассоциациях должно быть не так.

class Foo < ActiveRecord::Base
  has_many :search_terms, :as => :searchable, :through => :searchable_items
end

class Bar < ActiveRecord::Base
  has_many :search_terms, :as => :searchable, :through => :searchable_items
end

class SearchTerm < ActiveRecord::Base
  has_many :searchables, :through => :searchable_items
end

class SearchableItem < ActiveRecord::Base
  belongs_to :search_term
  belongs_to :searchable, :polymorphic => true
end

Я ожидал бы, что смогу сделать что-то вроде SearchTerm.find_by_term('SearchTerm').searchables (и он будет возвращать массив объектов Foo и Bar), однако я получаю ошибку Could not find the association :searchable_items in model SearchTerm

Заранее благодарим вас за любые идеи, которые вы можете предоставить мне!

1 Ответ

11 голосов
/ 09 января 2011

Вам необходимо добавить has_many :searchable_items связь к Foo, Bar и SearchTerm моделям, потому что опция :through => :searchable_items относится к этой ассоциации.

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

...