如果冲突,Ruby on Rails如何更新现有记录

时间:2012-02-13 22:05:30

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

在我的代码中,我有一个类别模型,它有许多子类别,子类别属于一个类别。

子类别有一个:position字段,用于跟踪它应该在该类别下排列的位置。这是我的SubCategory模型代码。

class Subcategory < ActiveRecord::Base
  belongs_to :category
  has_many :products
  validates_uniqueness_of :position
  scope :position, order("position asc")
end

正如您所看到的,它不允许重复的位置。当它检测到Subcategory位置已经存在时,我希望它提示用户说出“已经采取了这个位置,但仍然可以插入。你想继续吗?”是的|否。

如果是,那么我需要它为所有当前的类别子类别添加+1:位置(在“子类别问题”位置之后。所以如果类别1有子类别1,2和3,当有人试图添加在位置2的新子类别中,我需要将当前的2和3放到3和4,并将新的子类别插入到位置2。

如果否,那么我只想让它返回编辑屏幕。

我不确定如何准确编码,我假设检查:如果保存失败,位置冲突将在子类别控制器中。

所以我的两个问题是:检查此代码的最佳位置在哪里,我需要帮助/想法编写代码。

2 个答案:

答案 0 :(得分:1)

我建议acts_as_list来管理这个职位。它处理你正在谈论的所有事情,除了你需要手动检查碰撞以提示用户:

if Subcategory.exists?(:position => params[:position])  # or whatever
  # alert the user
end

答案 1 :(得分:0)

除了设置唯一性验证之外,这将重新索引位置:

# build a new subcategory
subcategory = category.subcategories.build(:foo => :bar)

# some arbitrary, zero-based position desired by your user
position = 3

# insert the subcategory at the desired position
category.subcategories.insert(position, subcategory)

# use each with index to re-index all of your subcategories
category.subcategories.each_with_index do |sc, index|
   sc.position = index
end

您可以向Category添加before_validation回调,而不是验证唯一性,只需确保您在子类别中有一组已排序的,连续的位置。