Стремительная загрузка для полиморфных ассоциаций - PullRequest
1 голос
/ 15 июля 2010

Не уверен, что это может упасть в разделе производительности, а также в разделе модели / базы данных, так что вот так ...

Допустим, у меня есть 3 модели:

Movie {
has_one :interest, :as => :resource
}
Song {
has_one :interest, :as => :resource
}
Story {
has_one :interest, :as => :resource
}

и...

Interest {
belongs_to :resource, :polymorphic => true
}

Теперь, если мне нужен список всех интересов для всех фильмов, и я хочу показать также дату создания этих объектов Movies (чтобы указать, сколько им было лет), тогда я используюпоиск атрибута resource_type, а затем @ some_interest.resource.created_at.

Проблема в том, что если у меня 100 интересов в фильме, тогда я получу 101 запрос, верно?Итак, линейная деградация.Я попытался использовать: include => [: resource] в своем запросе, но там говорится, что нельзя использовать include в полиморфных ассоциациях.

Как я могу либо загрузить, либо оптимизировать эту проблему, чтобы избежать серьезной деградации ??

Любая помощь будет принята с благодарностью !!

1 Ответ

0 голосов
/ 15 июля 2010

Если вы используете searchlogic , существует специальный синтаксис для работы с полиморфными отношениями, которые могут помочь. Вы можете искать на стороне has отношения, указав имя связанного класса с суффиксом type.

например. учитывая ваши модели, вы должны иметь возможность сделать что-то подобное для создания фильмов, созданных за последние 90 дней:

Interest.resource_movie_type_created_at_gt(Time.now-90.days)

Searchlogic настраивает объединение связанной модели для вас, что должно устранить проблемы с производительностью.

Конечно, вы всегда можете написать свой собственный SQL, используя метод find_by_sql.

PS. Один очень полезный трюк - включить ведение журнала в консоли Rails во время записи запросов. Это позволяет вам видеть SQL, сгенерированный прямо в консоли, без необходимости копаться в журналах.

...