Ruby on rails 是否可以在保存前使用对嵌套的属性进行排序?

Ruby on rails 是否可以在保存前使用对嵌套的属性进行排序?,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,在我的发行版模型中,我有以下代码来保存与发行版关联的曲目。在其当前状态下,轨迹以随机顺序保存到DB中。我知道SQL语句没有按设定的顺序执行,原因是什么 accepts_nested_attributes_for :tracks, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => :true def track_attributes=(track_attributes) track_attribu

在我的发行版模型中,我有以下代码来保存与发行版关联的曲目。在其当前状态下,轨迹以随机顺序保存到DB中。我知道SQL语句没有按设定的顺序执行,原因是什么

 accepts_nested_attributes_for :tracks, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => :true

 def track_attributes=(track_attributes)
   track_attributes.each do |attributes|
     tracks.build(attributes)
     artists_tracks.build(attributes)
   end
 end
是否可以通过before_save调用添加order_tracks def,以确保它们以正确的顺序进入数据库?我有轨道编号字段,可用于确定顺序

像这样的

before_save :order tracks

def order_tracks
tracks.sort_by { |track| track.track_number }
end
上述方法不起作用

编辑

我发现了一个相关的问题。我之前通过轨迹控制器创建操作设置标签和用户ID,使用:

@track.user_id = current_user.id
@track.label_id = @release.label.id
现在我通过接受嵌套属性添加轨迹,这不再有效


我在想,如果我能弄清楚在哪里设置这些,我可以写一些类似的东西,在我的发行版轨道模型中手动设置位置,而不是通过acts as列表。

我假设您需要按特定顺序选择这些轨道。然后可以在关联中定义:order param,例如:

class Album < ActiveRecord::Base
  has_many :tracks, :order => "track_number asc"
end

我已经有了这个,它在我的视图中显示轨迹方面工作得很好……但它们以正确的顺序添加到db中很重要,因为有一个包含acts_as_列表的连接表,创建了一个我希望最终使用的位置,以允许拖放重新排序……啊,但是您如何确保轨迹以正确的顺序添加到db中呢?我希望表单中包含每条赛道的赛道编号字段。这就是问题所在——它们没有按正确的顺序添加。我可以用我的曲目编号字段伪造顺序,但例如,如果我有主键/姓名/曲目编号,我可能会得到1/3/3和2/1/1和3/2/2。主键本身是不相关的,但添加的订单记录似乎是连接中基于此的位置字段的编号。应该在保存之前:订单跟踪,但这可能不是您的问题。是的,这里的输入错误……在我的模型中是正确的,但仍然不起作用: