【问题标题】:How to ensure one child record remains?如何确保保留一个孩子的记录?
【发布时间】:2015-04-03 11:26:12
【问题描述】:

在我的 Rails 4 应用程序中,我有 users,他可以有很多 rates

class Rate < ActiveRecord::Base

  belongs_to :user

  validates :name, :presence => true
  validates :amount, :presence => true

  ...

end

速率具有nameamount 和布尔属性default

如何确保user 不会意外删除他的最后一个rate,即至少有一个速率始终与用户保持关联,并且该速率的默认属性设置为true,如果没有还剩其他费率吗?

感谢您的任何想法。

【问题讨论】:

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


    【解决方案1】:

    您可以使用像这样的特定方法来做到这一点

    class User
      def delete_rate(rate)
        if rates.count > 1
          self.rates.delete(rate)
        else
          raise "User should have at least one rate"
        end
      end
    end
    

    或者您可以添加这样的验证:

    class User
      validates :rates, length: { minimum: 1 }
    end
    

    但最后一种解决方案可能会在用户创建方面引入问题。

    【讨论】:

      【解决方案2】:

      也许是……

      class Rate < ActiveRecord::Base
      
        belongs_to :user
      
        validates :name, :presence => true
        validates :amount, :presence => true
      
        after_initialize :set_default, if: ->{ user.rates.count == 1 }
        after_destroy :ensure_rate_exists
      
       private
      
         def set_default
          self.default = true
         end
      
         def ensure_rate_exists
          raise "Cannot remove.." if user.rates.count.zero?
         end
      
      end
      

      【讨论】:

        【解决方案3】:

        您可以将验证移至用户,并将费率作为嵌套属性进行管理。像

        class User < ActiveRecord::Base
          has_many :rates, dependent: :destroy 
          accepts_nested_attributes_for :rates, allow_destroy: true
          validates_presence_of :rates
        end
        

        费率不用担心

        class Rate < ActiveRecord::Base
          belongs_to :user
          after_initialize :set_default, if: ->{ user.rates.count == 1 }
          ...
        
        private
        
          def set_default
           self.default = true
          end 
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-10
          • 2018-05-09
          • 2017-11-28
          • 1970-01-01
          • 1970-01-01
          • 2012-04-12
          • 2017-04-16
          • 2016-12-13
          相关资源
          最近更新 更多