【问题标题】: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
速率具有name、amount 和布尔属性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