在使用回调进行保存之前排序为关联

时间:2014-01-06 15:55:56

标签: ruby-on-rails ruby-on-rails-4

我最近从Rails 3迁移到Rails 4,在此过程中我注意到排序关联在Rails 4中不起作用。以下是示例模型:

#box.rb

class Box < ActiveRecord::Base
  has_many :items

  accepts_nested_attributes_for :items, :allow_destroy => true

  before_validate
    items.sort! { <some condition> } 
  end
end

#item.rb

class Item < ActiveRecord::Base
  belongs_to :box
end

在Rails 3中,关联上的sort!方法修改了items哈希值,但在Rails 4中它返回一个新的已排序实例但不修改实际实例。有办法克服这个问题吗?

2 个答案:

答案 0 :(得分:0)

试试这个:

#box.rb

class Box < ActiveRecord::Base
  has_many :items

  accepts_nested_attributes_for :items, :allow_destroy => true

  before_validate
    self.items = items.sort { <some condition> } 
  end
end

#item.rb

class Item < ActiveRecord::Base
  belongs_to :box
end

答案 1 :(得分:0)

存储前的排序确实很有帮助。当您从数据库中提取它们时,它们可能不是那种顺序。您不想在有多个(或在项目模型中)指定订单。

如果您的订购更复杂,请发布该逻辑。

class Box < ActiveRecord::Base
  # Can replace position with hash like: { name: :asc }
  has_many :item, -> { order(:position) }

  accepts_nested_attributes_for :items, :allow_destroy => true

  before_validate
    items.sort! { <some condition> } 
  end
end