【问题标题】:How to update existing records if conflict, Ruby on Rails如果冲突,如何更新现有记录,Ruby on Rails
【发布时间】:2012-02-13 22:05:29
【问题描述】:

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

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

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

如您所见,它不允许重复位置。当它检测到子类别位置已存在时,我希望它提示用户说“该位置已被占用,但仍可以插入。您要继续吗?”是 |没有。

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我建议acts_as_list 管理该职位。这可以处理您所说的所有内容,除了您需要手动检查冲突以提示用户:

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

    【讨论】:

      【解决方案2】:

      将唯一性验证放在一边,这将重新索引位置:

      # 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 回调,而不是验证唯一性,以确保您在子类别中拥有一组排序的、连续的位置。

      【讨论】:

      • 我没有很好地解释最后一点。忘记回调。类别可以有一个自定义验证,以确保如果它有子类别,这些子类别具有一组连续的位置值。
      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 2013-12-13
      相关资源
      最近更新 更多