2013-03-01 24 views
1

假设我有两个这样定义的模型,其中一个具有自定义验证,用于检查其父母(所有者)是否存在某种情况。这可能是父任何条件,不只是一个我使用的例子:如何获取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内不可用。

在此先感谢!

回答

1

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

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

编辑: 上如此相似的问题: Rails: :inverse_of and Association extensions

+1

不幸的是,它看起来像':inverse_of'不HABTM协会工作。我试着将它添加到'has_and_belongs_to_many'的两个调用中,并在Rails 4.1中得到'Unknown key:inverse_of(ArgumentError)' – Cameron 2013-03-04 22:25:59

+0

它工作正常,我在模型组“has_and_belongs_to_many:users,inverse_of :: groups” – 2014-08-26 00:21:05

相关问题