举例:
- A
Place
属于User
。 - 一个
Event
属于一个User
。 - An
Event
属于(但不是必须拥有) aPlace
。
我想验证 an总是与Event
它本身相同。Place
User
Place
这种形式的验证似乎相当普遍,但我总是最终编写自己的验证器。为了完整起见,我将在下面包含我的版本,但我觉得应该有一个约定。
举例:
Place
属于User
。Event
属于一个User
。Event
属于(但不是必须拥有) a Place
。我想验证 an总是与Event
它本身相同。Place
User
Place
这种形式的验证似乎相当普遍,但我总是最终编写自己的验证器。为了完整起见,我将在下面包含我的版本,但我觉得应该有一个约定。
如果 anEvent
总是与 相同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模式。有几种方法可以实现它;也许单表继承是合适的。
本质上,您将创建一个子类NullPlace < Place
,它会有一些特殊的行为(它name
可能是一些占位符,如“未指定”),但就关联而言,它的行为就像一个常规的Place
,所以不需要验证!
在我的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