在我的代码中,我有一个类别模型,它有许多子类别,子类别属于一个类别。
子类别有一个: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。
如果否,那么我只想让它返回编辑屏幕。
我不确定如何准确编码,我假设检查:如果保存失败,位置冲突将在子类别控制器中。
所以我的两个问题是:检查此代码的最佳位置在哪里,我需要帮助/想法编写代码。
答案 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回调,而不是验证唯一性,只需确保您在子类别中有一组已排序的,连续的位置。