嗯,就我而言,我需要通过中间表中名为 weight 的列对多对多关系进行排序。经过数小时的尝试,我找到了两种解决方案来对多对多关系进行排序。
解决方案 1:在 Rails 方式中
picture.users.where(:order => "created_at")
无法返回按 Picturization 的 created_at 列排序的 ActiveRecord::Relation。
我曾尝试在 Picturization 中重写一个 default_scope 方法,但它不起作用:
def self.default_scope
return Picturization.all.order(weight: :desc)
end
相反,首先,您需要获取排序后的图片的 id:
ids = Picturization.where(user_id:user.id).order(created_at: :desc).ids
然后,您可以使用MySQL field functin获取排序后的对象
picture.users.order("field(picturizations.id, #{ids.join(",")})")
生成 SQL 如下所示:
SELECT `users`.*
FROM `pictures` INNER JOIN `picturizations`
ON `pictures`.`id` = `picturizations`.`picture_id`
WHERE `picturizations`.`user_id = 1#for instance
ORDER BY field(picturizations.id, 9,18,6,8,7)#for instance
解决方案 2:在原始 SQL 方式中
您可以使用order by函数直接得到答案:
SELECT `users`.*
FROM `pictures` INNER JOIN `picturizations`
ON `pictures`.`id` = `picturizations`.`picture_id`
WHERE `picturizations`.`user_id = 1
order by picturizations.created_at desc