Rails сложные запросы от SQL до AREL - PullRequest
2 голосов
/ 27 марта 2012

Для тех, кто не из среды 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, пожалуйста, поделитесь своими мыслями.

Примечание: Если мне нужно предоставить дополнительные примеры, пожалуйста, скажите, и я сделаю:)

1 Ответ

1 голос
/ 07 мая 2012

Для всего, что не требует пользовательских объединений или предложений - то есть может быть сопоставлено с отношениями AR - вы можете использовать squeel вместо arel.AREL - это в основном тяжеловесный DSL реляционной алгебры, который вы можете использовать для написания SQL-запросов с нуля в ruby.Squeel - это более интересный DSL для запросов активных записей, который исключает большинство случаев, когда вы используете операторы литералов SQL.

...