验证多个belongs_to关系

时间:2013-06-08 15:45:24

标签: ruby-on-rails-3

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

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

2 个答案:

答案 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