假设我们有以下数据结构(想象为循环)。
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
这样我首先可以验证是否存在具有此类ID的Client
。然后我通过p.matsinopoulos实现了自定义验证器。它尚未经过测试,但由于我现在正在使用这些对象,它应该可以解决问题。
答案 0 :(得分:1)
如果我是你,我会写一个自定义验证器。
validate :client_belongs_to_user
protected
def client_belongs_to_user
errors[:client] << 'must own the user' if client.present? && client.user != user
end
答案 1 :(得分:0)
我建议,建立在你拥有的东西上:
class MyModel < ActiveRecord::Base
belongs_to :client
has_one :user, :through => :client
attribute_accessor :client_id
validates :client_id, :presence => true
...
end
class Client < ActiveRecord::Base
has_many :my_models
belongs_to :user
attribute_accessor :user_id
validates :user_id, :presence => true
...
end
class User < ActiveRecord::Base
has_many :clients
...
end