使用ActiveRecord重新排序关联的记录

时间:2013-12-31 02:07:08

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

我想保存关联记录的顺序,但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]。我怎么能这样做?

谢谢!

2 个答案:

答案 0 :(得分:0)

由于某种原因,相关记录被称为集合 - 它们未被订购。这反过来是因为它们基于SQL,除了为此目的利用列值之外,它不提供建立/保留订单的机制。

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

答案 1 :(得分:0)

你想要的方式是不可能的。

但是你想要做的是做一些调整。

将名为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)

这会产生您期望的结果