Ruby on rails 3 是否存在关联一致性的ActiveModel验证

Ruby on rails 3 是否存在关联一致性的ActiveModel验证,ruby-on-rails-3,validation,activemodel,Ruby On Rails 3,Validation,Activemodel,举例来说: 位置属于用户 事件属于用户 事件属于(但不需要)一个位置 我想验证事件的位置是否始终与位置本身具有相同的用户 这种形式的验证似乎相当常见,但我总是编写自己的验证程序。为了完整起见,我将在下面列出我的版本,但我觉得应该有一个约定。在我的事件中模型: validate :user_consistency def user_consistency errors.add :place, 'must belong to same user as event' unless place

举例来说:

  • 位置
    属于
    用户
  • 事件
    属于
    用户
  • 事件属于(但不需要)一个
    位置
我想验证
事件
位置
是否始终与
位置
本身具有相同的
用户


这种形式的验证似乎相当常见,但我总是编写自己的验证程序。为了完整起见,我将在下面列出我的版本,但我觉得应该有一个约定。

在我的
事件中
模型:

validate :user_consistency

def user_consistency
  errors.add :place, 'must belong to same user as event' unless place.nil? or place.user == user
end
如果
事件
始终与
位置
具有相同的
用户
,那么您可能应该像这样对关联进行建模:

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
那么你就不需要验证了;协会的结构免费实施这一点

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


本质上,您将创建一个子类
NullPlace
,该子类将具有一些特殊行为(其
name
可能是一些类似“notspecified”的占位符),但就关联而言,它的行为与常规
Place
一样,因此不需要验证

不幸的是,这要求
事件
必须有一个
位置
,这不是必需的,因此需要进行
位置.nil?
检查。好的建议,我已经更新了我的问题来说明这一点。对不起,我只是略读了你的答案。我已经用一种可能的方法更新了我的方法。
NullPlace
是一个很好的建议!悲剧是我们的系统已经有了一些不真实但实际的占位符
place
s!我只是没想过要这样扩展它。谢谢