在我的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
,即至少一个费率始终与用户保持关联,并且该费率的默认属性设置为{{1如果没有剩余其他费率?
感谢任何想法。
答案 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