mysql - 在与 ActiveRecord 的多对多关系上使用带顺序的不同方法

标签 mysql ruby-on-rails activerecord sql-order-by distinct

我在 ActiveRecord 中定义了一个经典的多对多关系:

class Developer < ApplicationRecord
  has_many :developers_code_reviews
  has_many :code_reviews, through: :developers_code_reviews
end

class DevelopersCodeReview < ApplicationRecord
  belongs_to :code_review
  belongs_to :developer
end

class CodeReview < ApplicationRecord
  has_many :developers_code_reviews
  has_many :developers, through: :developers_code_reviews
end

我基本上想要一个 Developer 数组,按 code_review.created_at 排序,没有 double 。

我的第一次尝试是最基本的:Developer.order('code_reviews.created_at': :asc) 触发了这个错误:ActiveRecord::StatementInvalid: Mysql2::Error: Unknown “order 子句”中的“code_reviews.created”列

经过几次谷歌搜索后,我了解到 ActiveRecord 不会自动执行连接,因此我添加了它:Developer.joins(:code_reviews).order('code_reviews.created_at': :asc)。这个有效,但里面有 double 。我需要一个开发人员在这个数组中只出现一次。

如果我尝试在该查询上创建不同的查询,ActiveRecord/MySQL 会提示 ORDER BY 未在 SELECT 中的列上执行。我该如何解决这个问题?

我在谷歌上搜索了很多,我找不到任何东西。

注意

有效但 加倍的 MYSQL 查询如下所示:

SELECT `developers`.*
FROM `developers`
INNER JOIN `developers_code_reviews` ON `developers_code_reviews`.`developer_id` = `developers`.`id`
INNER JOIN `code_reviews` ON `code_reviews`.`id` = `developers_code_reviews`.`code_review_id` 
ORDER BY `code_reviews`.`created_at` ASC

而且我想对开发者有一个独特的看法。

最佳答案

感谢这个关于 MySQL 子查询的清晰示例,我找到了答案:http://www.mysqltutorial.org/mysql-subquery/

通过这个例子,我了解到我需要一个如下所示的子查询:

SELECT *
FROM developers
LEFT OUTER JOIN (
  SELECT developer_id, max(updated_at) max_updated_at
  FROM developers_code_reviews
  GROUP BY developer_id
) dcr
ON developers.id = dcr.developer_id
ORDER BY maxupdt

在我的案例中转换为 ruby​​:

class DevelopersCodeReview < ApplicationRecord
  belongs_to :code_review
  belongs_to :developer

  class << self
    def developer_queue
      select('developer_id, max(updated_at) max_updated_at').
      group(:developer_id)
    end
  end
end

class Developer < ApplicationRecord
  belongs_to :slack_workspace
  belongs_to :project, optional: true

  class << self
    def queue
      developer_queue = DevelopersCodeReview.developer_queue.to_sql

      joins("LEFT OUTER JOIN (#{developer_queue}) dcr ON id = dcr.developer_id").
      order(max_updated_at: :asc)
    end
  end
end

关于mysql - 在与 ActiveRecord 的多对多关系上使用带顺序的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59103829/

相关文章:

java.sql.SQLSyntaxErrorException : Table '' doesn't exist

javascript - 具有点击率的动态 Ajax MySQL 列表

单击按钮时的php mysql更新数据库

ruby-on-rails - rails console --sandbox 在退出时不回滚

jquery - 无法将 jQuery gem 安装到 Rails

ruby-on-rails - 计算和检索多态关联的对象

ruby-on-rails - 是否有任何Rails插件可为ActiveRecord迁移文件中的每一列添加注释?

mysql - 导入维基百科数据库 : create table structure

ruby-on-rails - 如何避免 ActiveRecord_Relation 的未定义方法 `id'?

ruby-on-rails - 如何通过 has_one 关联的属性对模型进行分组和计数?