1

所以我正在编写一个具有以下模型和关联的应用程序:

class Company < ActiveRecord::Base
  has_many :customers, :dependent => :destroy
  has_many :goals, :dependent => :destroy
end

class Customer < ActiveRecord::Base
  belongs_to :company
  has_many :tasks
  has_many :goals, through: :tasks
end

class Goal < ActiveRecord::Base
  has_many :tasks, :dependent => :destroy
  belongs_to :company
  has_many :customers, through: :tasks
end

class Task < ActiveRecord::Base
  belongs_to :goal
  belongs_to :customer
end

现在在视图中,新任务的 form_for 已经选择了目标或客户,而其他关联选择是基于其他模型的过滤集。理论上,用户不可能在两个不同的公司下创建任务,即@task.goal.company == @task.customer.company。

但是,进行验证以检查是否只有一个祖父母似乎是一种好习惯。我了解使用 Proc.new 可以验证是否满足特定条件,但我希望它始终验证,所以这不是我正在寻找的解决方案。

谢谢。

顺便说一句,如果模型结构看起来很可笑,或者我是否明确地违反了 Rails 约定,请告诉我。

4

1 回答 1

0

proc.new 和方法在验证方面是完全等价的。也就是说,您可能正在寻找这样的东西:

class Task < ActiveRecord::Base
  belongs_to :goal
  belongs_to :customer

  validate :companies_match

  private

  def companies_match
    self.errors.add(:base, "Goal company and customer company must be equivalent") unless goal.company == customer.company
  end
end
于 2012-06-28T16:46:15.513 回答