Rails从SQL到AREL的复杂查询

Rails从SQL到AREL的复杂查询,sql,ruby-on-rails-3,activerecord,associations,arel,Sql,Ruby On Rails 3,Activerecord,Associations,Arel,对于来自非ActiveRecord环境的人来说,复杂的查询很有挑战性。我非常熟悉编写SQL的方法,但是我很难理解如何用AREL实现某些查询。我试着自己找出下面的例子,但似乎找不到正确的答案 以下是我选择AREL方式而不是当前的find\u by\u sql方式的一些原因: 我的模型中有更干净的代码 更简单的代码(由于链接,此查询与分页结合使用时。) 更多的多db兼容性(例如,我习惯于按topics.id对进行分组,而不是指定我在SELECT子句中使用的所有列) 以下是我的模型的简化版本: c

对于来自非ActiveRecord环境的人来说,复杂的查询很有挑战性。我非常熟悉编写SQL的方法,但是我很难理解如何用AREL实现某些查询。我试着自己找出下面的例子,但似乎找不到正确的答案

以下是我选择AREL方式而不是当前的
find\u by\u sql
方式的一些原因:

  • 我的模型中有更干净的代码
  • 更简单的代码(由于链接,此查询与分页结合使用时。)
  • 更多的多db兼容性(例如,我习惯于按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的直接转换,欢迎对解决方案的任何指导或见解。 另一句话,如果您认为使用sql finder编写这些查询是完全可以接受的解决方案,请分享您的想法


注意:如果我需要提供其他示例,请这样说,我将:)

对于任何不需要自定义联接或on子句的内容(即可以映射到AR关系),您可能希望使用arel而不是arel。AREL基本上是一个重量级的关系代数DSL,您可以使用它在ruby中从头开始编写SQL查询。对于活动记录查询来说,squel更像是一种奇特的DSL,它消除了大多数使用SQL文本语句的情况