Ruby on rails Rails:如何对多对多关系进行排序
我有一个模型用户和图片之间的多对多关系。它们由一个名为Picturization的联接表链接 如果我获得单个图片的用户列表,即picture.users->我如何确保获得的结果通过创建图片化行(即图片与用户关联的顺序)进行排序。如果我想按修改的顺序获得它,该如何更改 谢谢 编辑 也许像Ruby on rails Rails:如何对多对多关系进行排序,ruby-on-rails,sorting,many-to-many,Ruby On Rails,Sorting,Many To Many,我有一个模型用户和图片之间的多对多关系。它们由一个名为Picturization的联接表链接 如果我获得单个图片的用户列表,即picture.users->我如何确保获得的结果通过创建图片化行(即图片与用户关联的顺序)进行排序。如果我想按修改的顺序获得它,该如何更改 谢谢 编辑 也许像 picture.users.where(:order => "created_at") 但是这个created_at指的是图片化中的created_at 在图片化表中有一个类似于序列的附加列,并将排序顺
picture.users.where(:order => "created_at")
- 但是这个created_at指的是图片化中的created_at
default_scope :order => 'sequence ASC'
如果您想要基于修改的_的默认排序顺序,请使用以下默认范围
default_scope :order => 'modified_at DESC'
可以在order方法/子句中指定表名:
picture.users.order("picturizations.created_at DESC")
在我的例子中,我需要通过中间表中名为weight的列对多对多关系进行排序。经过几个小时的尝试,我想出了两种解决方案来排序多对多关系 解决方案1:以轨道方式 无法返回按图片化的created_at列排序的ActiveRecord::关系 我尝试在图片化中重写默认的\u 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
然后,您可以使用
它生成的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方式
您可以通过使用按排序功能直接获得答案:
SELECT `users`.*
FROM `pictures` INNER JOIN `picturizations`
ON `pictures`.`id` = `picturizations`.`picture_id`
WHERE `picturizations`.`user_id = 1
order by picturizations.created_at desc
我注意到,图片化已经在其表列中创建并修改了_at(默认情况下?)。我可以用这个吗?如果你想把列上的_修改成序列顺序,你可以这样做。
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
SELECT `users`.*
FROM `pictures` INNER JOIN `picturizations`
ON `pictures`.`id` = `picturizations`.`picture_id`
WHERE `picturizations`.`user_id = 1
order by picturizations.created_at desc