1

假设我有两个这样定义的模型,一个带有自定义验证,用于检查其父级(所有者)的某些条件。它可以是父母的任何条件,而不仅仅是我在示例中使用的条件:

class Project < ActiveRecord::Base
  has_and_belongs_to_many :phrases
end

class Phrase < ActiveRecord::Base
  has_and_belongs_to_many :projects

  validate do
    if self.projects.size == 0
      errors.add(:base, "Must have at least one parent project")
    end
  end
end

然后,在创建一个新项目后,我想在它下面创建一个新短语:

project = Project.create!(:name => "My Project")
phrase = project.phrases.create!(:value => "My phrase")

运行验证时,连接表中实际上没有创建任何行,并且phrase未保存。验证失败,正如我们预期的那样。

那么问题是:如何访问块Project内的父实例validate?既然我打电话给project.phrases.create!我,我明确地说“创建一个新Phrase的作为这个特定父母的孩子Project”。有什么方法可以访问它吗?ActiveRecord 关联提供了一种方法,但据我所知owner,它在内部不可用。validate

提前致谢!

4

1 回答 1

1

使用 inverse_of,它有助于了解内存中已经存在的对象。

http://gsusmonzon.blogspot.in/2011/09/rails-power-of-inverseof.html

编辑: 关于 SO 的类似问题: Rails: :inverse_of 和 A​​ssociation extensions

于 2013-03-01T08:04:26.010 回答