Rails没有填充与find(:include)的反向引用关联

时间:2012-01-21 21:04:39

标签: ruby-on-rails activerecord associations

使用相对较大的数据集我遇到的情况是我需要使用关联的表加载数据,然后在关联的对象需要回调到第一个对象的过程中。但是它似乎没有填充对象的后引用,所以即使使用:include它有很多sql查询

例如:

class Movie
  belongs_to :title
end

class Title
  has_one: movie
end

首先,我通过

加载数据
Movie.all(:include => [ :title ])

这导致两个sql查询。一个用于加载所有电影,另一个用于按ID加载所有标题。

其次(出于简单演示的目的)我想用标题来取回电影。

movies.collect{ |movie|
  cur_title = movie.title
  back_reference = cur_title.movie
}

这就是问题所在。我假设不需要进一步的查询作为已经加载的一对一关系的双方。但是,collect中的第二行会导致许多新查询加载标题中的每个“电影”。有没有办法让rails在标题内自动填写这个反向引用以避免许多额外的(冗余)查询,或者这可以通过简单的方式手动完成?

在Rails 2.3.12下运行

1 个答案:

答案 0 :(得分:2)

Rails 3.x有一个名为:inverse_of的机制来指定反向关联。

即;

class Movie
  belongs_to :title, :inverse_of => :movie
end

class Title
  has_one :movie, :inverse_of => :title
end

在这种情况下,您将无法重新加载。

在Rails 2.x中,您可能会发现@ h-lame的parental_control是一个有用的临时解决方案。