【问题标题】:Rails: How to sort many-to-many relationRails:如何对多对多关系进行排序
【发布时间】:2017-05-04 19:26:49
【问题描述】:

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

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

谢谢!

编辑 也许像

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

【问题讨论】:

    标签: ruby-on-rails sorting many-to-many


    【解决方案1】:

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

    default_scope :order => 'sequence ASC'
    

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

    default_scope :order => 'modified_at DESC'
    

    【讨论】:

    • 我注意到 picturization 已经在其表列中创建了 created_at 和 modified_at (默认情况下?)。我可以以某种方式使用它吗?
    • 如果想要以 modified_at 列作为序列顺序,那么您可以这样做。
    【解决方案2】:

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

    picture.users.order("picturizations.created_at DESC")
    

    【讨论】:

      【解决方案3】:

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

      相反,首先,您需要获取排序后的图片的 id:

      ids = Picturization.where(user_id:user.id).order(created_at: :desc).ids
      

      然后,您可以使用MySQL field 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函数直接得到答案:

      SELECT `users`.* 
      FROM `pictures` INNER JOIN `picturizations` 
      ON `pictures`.`id` = `picturizations`.`picture_id` 
      WHERE `picturizations`.`user_id = 1
      
      order by picturizations.created_at desc
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-08
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 2015-07-28
        • 2019-01-26
        • 2012-02-20
        • 1970-01-01
        相关资源
        最近更新 更多