我在模型用户和图片之间有多对多的关系。这些由一个称为 Picturization 的连接表链接。
如果我获得一张图片的用户列表,即picture.users -> 我如何确保获得的结果是通过创建Picturization 行(即图片与用户关联的顺序)排序的。如果我想按修改顺序获得它,这将如何改变?
谢谢!
编辑 也许像
picture.users.where(:order => "created_at")
- 但是这个created_at指的是图片化中的created_at
我在模型用户和图片之间有多对多的关系。这些由一个称为 Picturization 的连接表链接。
如果我获得一张图片的用户列表,即picture.users -> 我如何确保获得的结果是通过创建Picturization 行(即图片与用户关联的顺序)排序的。如果我想按修改顺序获得它,这将如何改变?
谢谢!
编辑 也许像
picture.users.where(:order => "created_at")
在图片化表中有一个类似于序列的附加列,并将排序顺序定义为图片化中的默认范围
default_scope :order => 'sequence ASC'
如果您想要基于 modified_at 的默认排序顺序,请使用以下默认范围
default_scope :order => 'modified_at DESC'
您可以在 order 方法/子句中指定表名:
picture.users.order("picturizations.created_at DESC")
好吧,就我而言,我需要通过中间表中名为 weight 的列对多对多关系进行排序。经过数小时的尝试,我想出了两种解决方案来对多对多关系进行排序。
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
您可以通过使用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