0

举例:

  • APlace属于User
  • 一个Event属于一个User
  • AnEvent属于(但不是必须拥有) a Place

我想验证 an总是与Event它本身相同。PlaceUserPlace

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

4

2 回答 2

2

如果 anEvent 总是与 相同UserPlace也许您应该像这样对关联进行建模:

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模式。有几种方法可以实现它;也许单表继承是合适的。

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

于 2013-01-25T22:45:10.943 回答
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
于 2013-01-25T22:39:36.870 回答