我在 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/