Избегать вложенных запросов в именованные группы


Я использую именованные группы повсюду.

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

Например, предположим, у меня есть посты таблицы один-ко-многим отношение к теги таблицы. Я мог бы добавить with_tags области на мой пост модели такой:

named_scope :with_tags, lambda { |tags|
  tags = [tags] if tags.kind_of? String
  {:conditions => ["id IN (SELECT post_id FROM tags WHERE name IN (?))", tags]}
}

Однако, это не кажется идеальным. Многие базы данных можно использовать соединение более эффективно, чем они могут использовать подзапрос. Запрос, который выглядит как это могло бы работать лучше:

SELECT DISTINCT posts.* FROM posts JOIN tags ON posts.id = tags.post_id WHERE tags.name IN (?)

Как другие люди делают это? Вы используете :включить/:присоединяйтесь параметров хитро, чтобы знать, что псевдонимы и ActiveRecord будет использовать?



891
7
задан 10 февраля 2011 в 09:02 Источник Поделиться
Комментарии
1 ответ

Вы хотите использовать то, что рельсы вызывает жадную загрузку. Это делается с помощью :включить параметра в АР звонок. Добавить его в лямбда-выражения.

2
ответ дан 2 марта 2011 в 06:03 Источник Поделиться