如何确保一个孩子的记录仍然存在?

时间:2015-04-03 11:26:13

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

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

class Rate < ActiveRecord::Base

  belongs_to :user

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

  ...

end

费率包含nameamount和布尔属性default

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

感谢任何想法。

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

之类的东西
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