以示例:
Place
属于User
。Event
属于User
。Event
属于(但不是必须)Place
。我想验证Event
的{{1}}始终与Place
本身具有相同的User
。
这种形式的验证看起来相当普遍,但我总是最终编写自己的验证器。我将在下面包含我的版本以保证完整性,但我觉得应该有一个约定。
答案 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