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