2

假设我们有以下数据结构(想象成一个循环)。

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 实现了自定义验证器。它尚未经过测试,但由于我现在正在处理这些对象,它应该可以解决问题。

4

2 回答 2

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
于 2013-06-08T20:59:49.007 回答
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
于 2013-06-08T20:51:07.463 回答