Для тех, кто не из среды ActiveRecord, сложные запросы являются сложными.Я достаточно хорошо знаю свой путь в написании SQL, но мне сложно понять, как выполнять определенные запросы только на AREL.Я попытался выяснить примеры ниже, но не могу найти правильных ответов.
Вот несколько причин, почему я выбрал AREL вместо моего текущего find_by_sql
-way:
- Более чистый код в моей модели.
- Более простой код (когда этот запрос используется в сочетании с разбиением на страницы из-за сцепления).
- Болееdb-совместимость (например, я привык к
GROUP BY topics.id
вместо указания всех столбцов, которые я использую в моем предложении SELECT
.
Вот упрощенная версия моих моделей:
class Support::Forum < ActiveRecord::Base
has_many :topics
def self.top
Support::Forum.find_by_sql "SELECT forum.id, forum.title, forum.description, SUM(topic.replies_count) AS count FROM support_forums forum, support_topics topic WHERE forum.id = topic.forum_id AND forum.group = 'theme support' GROUP BY forum.id, forum.title, forum.description ORDER BY count DESC, id DESC LIMIT 4;"
end
def ordered_topics
Support::Topic.find_by_sql(["SELECT topics.* FROM support_forums forums, support_topics topics, support_replies replies WHERE forums.id = ? AND forums.id = topics.forum_id AND topics.id = replies.topic_id GROUP BY topics.id ORDER BY topics.pinned DESC, MAX(replies.id) DESC;", self.id])
end
def last_topic
Support::Topic.find_by_sql(["SELECT topics.id, topics.title FROM support_forums forums, support_topics topics, support_replies replies WHERE forums.id = ? AND forums.id = topics.forum_id AND topics.id = replies.topic_id GROUP BY topics.id, topics.title, topics.pinned ORDER BY MAX(replies.id) DESC LIMIT 1;", self.id]).first
end
end
class Support::Topic < ActiveRecord::Base
belongs_to :forum, counter_cache: true
has_many :replies
end
class Support::Reply < ActiveRecord::Base
belongs_to :topic, counter_cache: true
end
Всякий раз, когда я могу, я стараюсь писать такие вещи через AREL, а не на SQL (по причинам, упомянутым ранее), но я просто не могу разобраться с неосновными примерами, такими какте, что указаны выше.
Кстати, я на самом деле не ищу прямых преобразований этих методов в AREL, приветствуются любые указания или понимание решения. Еще одно замечание, если вы считаете, что это совершенно приемлемое решение для написания этих запросов.остроумиеh sql-finder, пожалуйста, поделитесь своими мыслями.
Примечание: Если мне нужно предоставить дополнительные примеры, пожалуйста, скажите, и я сделаю:)