假设我们有以下数据结构(想象成一个循环)。
MyModel * -- 1 User 1 -- * Clients 0 -- * MyModel
因此,MyModel 看起来像:
class MyModel < ActiveRecord::Base
belongs_to :client
belongs_to :user
attr_accessible :user_id, :client_id, # ...
validates :user_id, :presence => true
所以它可以属于一个客户,但必须属于一个用户。此外,客户端必须属于用户。
但是我怎么能断言,如果有人保存了一个MyModel
属于客户端的实例,该客户端实际上属于用户呢?我是否必须为此编写自定义验证器,或者是否有任何我忽略的验证快捷方式?
解决方案:
按照 p.matsinopoulos 的回答,我现在做了以下事情。我没有MyModel
在保存之前分配外键,而是直接分配对象。
# my_model_controller.rb
def create
m = MyModel.create(whitelist_parameters(params[:my_model]))
m.user = current_user
if(params[:my_model][:client_id].present?)
client = Client.find params[:my_model][:client_id]
end
# ...
end
这样我可以首先验证是否有一个Client
具有这样的 ID。然后我通过 p.matsinopoulos 实现了自定义验证器。它尚未经过测试,但由于我现在正在处理这些对象,它应该可以解决问题。