是否存在关联一致性的ActiveModel验证

时间:2013-01-25 22:39:37

标签: ruby-on-rails-3 validation activemodel

以示例:

  • Place属于User
  • Event属于User
  • Event属于(但不是必须)Place

我想验证Event的{​​{1}}始终与Place本身具有相同的User

这种形式的验证看起来相当普遍,但我总是最终编写自己的验证器。我将在下面包含我的版本以保证完整性,但我觉得应该有一个约定。

2 个答案:

答案 0 :(得分:2)

如果Event 总是User具有相同的Place,那么您应该按照以下方式对关联进行建模:

User
  has_many :places
  has_many :events, through: :places

Place
  has_many :events
  belongs_to :user

Event
  belongs_to :place
  has_one :user, through: :place

然后你不需要验证;协会的结构强制执行免费。

更新:虽然Place是可选的,但我仍然会构建这样的关联!听起来你可能想要打破Null Object模式。有几种方法可以实现它;也许Single Table Inheritance是合适的。

基本上,你会创建一个子类NullPlace < Place,它会有一些特殊的行为(它的name可能是一些占位符,如“未指定”),但就它们的行为关联而言像常规的Place一样,所以不需要验证!

答案 1 :(得分:0)

在我的Event模型中:

validate :user_consistency

def user_consistency
  errors.add :place, 'must belong to same user as event' unless place.nil? or place.user == user
end