Rails:如何对多对多关系进行排序

我在模型User和Picture之间有多对多的关系。 它们通过名为Picturization的连接表链接。

如果我获得单个图片的用户列表,即picture.users – >如何确保获得的结果通过创建Picturization行(即图片与用户关联的顺序)进行排序。 如果我想按修改顺序获得这个,这将如何改变?

谢谢!

编辑也许像

picture.users.where(:order => "created_at") 
  • 但是这个created_at引用了picturization中的created_at

在图像化表中有一个类似序列的附加列,并在您的Picturization中将排序顺序定义为默认范围

 default_scope :order => 'sequence ASC' 

如果您想要基于modified_at的默认排序顺序,请使用以下默认范围

 default_scope :order => 'modified_at DESC' 

您可以在order method /子句中指定表名:

 picture.users.order("picturizations.created_at DESC") 

好吧,在我的情况下,我需要通过中间表中名为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 

相反,首先,您需要获取已排序的Picturization的ID:

 ids = Picturization.where(user_id:user.id).order(created_at: :desc).ids 

然后,您可以使用MySQL字段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方式

您可以通过function使用订单直接获得答案:

 SELECT `users`.* FROM `pictures` INNER JOIN `picturizations` ON `pictures`.`id` = `picturizations`.`picture_id` WHERE `picturizations`.`user_id = 1 order by picturizations.created_at desc