假设我有两个这样定义的模型,其中一个具有自定义验证,用于检查其父母(所有者)是否存在某种情况。这可能是父任何条件,不只是一个我使用的例子:如何获取ActiveRecord中未保存的HABTM集合代理的所有者?
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
未保存。验证失败,因为我们预计它应该。
接下来的问题是:我如何访问validate
块内的父Project
实例?由于我打电话给project.phrases.create!
,我明确地说“创建一个新的Phrase
作为此特定父母的子节点Project
”。有什么方法可以访问它吗? ActiveRecord协会提供owner
方法,但根据我所知,它在validate
内不可用。
在此先感谢!
不幸的是,它看起来像':inverse_of'不HABTM协会工作。我试着将它添加到'has_and_belongs_to_many'的两个调用中,并在Rails 4.1中得到'Unknown key:inverse_of(ArgumentError)' – Cameron 2013-03-04 22:25:59
它工作正常,我在模型组“has_and_belongs_to_many:users,inverse_of :: groups” – 2014-08-26 00:21:05