我想保存关联记录的顺序,但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]。我怎么能这样做?
谢谢!
答案 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)
这会产生您期望的结果