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!我只是没想过要这样扩展它。谢谢