【问题标题】:Reorder associated records with ActiveRecord使用 ActiveRecord 重新排序关联记录
【发布时间】:2013-12-31 02:07:07
【问题描述】:

我想保存关联记录的顺序,但 ActiveRecord 会自动对它们进行排序(我假设它可以稍后更快地搜索列表)。不过,我想以不同的方式保存订单。目前我有一些看起来像这样的东西:

m = Model.find 1
m.other_models_ids
irb> [1, 2, 3] 
m.other_models_ids = m.other_models_ids.shuffle
irb> [2, 1, 3]
m.save
m.other_models_ids
irb> [1, 2, 3]

我希望将订单保存为 [2, 1, 3]。我该怎么做?

谢谢!

【问题讨论】:

  • 不排序保存,从模型中查询的时候为什么不排序呢?
  • 或者您可以在 other_model 中有一个位置列,在改组时更新位置值,并以查询基于位置列的方式确定模型的范围。

标签: ruby-on-rails activerecord polymorphic-associations


【解决方案1】:

相关的记录被称为集合是有原因的——它们没有被排序。这反过来又是因为它们基于 SQL,除了为此目的使用列值之外,它不提供建立/保留订单的机制。

假设您不能依赖 id 值本身的顺序,并且单个“other_model”记录可以与多个“主”模型记录相关联,您需要建立一个单独的表来包含两者每个主要/其他记录的“订单”列和 ID。然后,您可以使用与该表的has_many through: 关系。

【讨论】:

    【解决方案2】:

    你试图做的方式是不可能的。

    但是你想要做的事情可以通过一些调整来实现。

    将名为position 的列添加到other_model 表中

    add_column :other_model, :position, :integer
    

    在你的控制台中

    m = Model.find 1
    m.other_models.shuffle.each_with_index do |val,index| 
      val.position = index + 1
      val.save!
    end
    
    m.reload
    m.other_models.order(:position).select(:id).map(&:id)
    

    这会产生你期望的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      相关资源
      最近更新 更多