0

我在模型用户和图片之间有多对多的关系。这些由一个称为 Picturization 的连接表链接。

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

谢谢!

编辑 也许像

picture.users.where(:order => "created_at")
  • 但是这个created_at指的是图片化中的created_at
4

3 回答 3

1

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

default_scope :order => 'sequence ASC'

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

default_scope :order => 'modified_at DESC'
于 2012-05-02T16:48:10.700 回答
0

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

picture.users.order("picturizations.created_at DESC")
于 2012-05-02T19:39:07.480 回答
0

好吧,就我而言,我需要通过中间表中名为 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 方式

您可以通过使用order by 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
于 2017-05-04T11:26:49.477 回答