Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:如何对多对多关系进行排序_Ruby On Rails_Sorting_Many To Many - Fatal编程技术网

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

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 在图片化表中有一个类似于序列的附加列,并将排序顺

我有一个模型用户和图片之间的多对多关系。它们由一个名为Picturization的联接表链接

如果我获得单个图片的用户列表,即picture.users->我如何确保获得的结果通过创建图片化行(即图片与用户关联的顺序)进行排序。如果我想按修改的顺序获得它,该如何更改

谢谢

编辑 也许像

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