Ruby on rails Rails不填充与find(:include)的反向引用关联

Ruby on rails Rails不填充与find(:include)的反向引用关联,ruby-on-rails,activerecord,associations,Ruby On Rails,Activerecord,Associations,使用相对较大的数据集时,我会遇到这样的情况:我需要使用关联的表加载数据,随后在这个过程中,关联的对象需要回调到第一个对象。但是,它似乎没有填充对对象的反向引用,因此即使使用:include,它也有许多sql查询 例如: class Movie belongs_to :title end class Title has_one: movie end 首先,我通过 Movie.all(:include => [ :title ]) 这将导致两个sql查询。一个用于加载所有电影,另

使用相对较大的数据集时,我会遇到这样的情况:我需要使用关联的表加载数据,随后在这个过程中,关联的对象需要回调到第一个对象。但是,它似乎没有填充对对象的反向引用,因此即使使用: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在标题中自动填充这个back引用,以避免许多额外的(冗余的)查询,或者可以用一种简单的方法手动完成


在Rails 2.3.12下运行的Rails 3.x有一个名为
:inverse\u of
的机制来指定反向关联

即,

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

class Title
  has_one :movie, :inverse_of => :title
end
在这种情况下,您将无法重新加载


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

谢谢!事实上,我认为这只是Rails 3中的问题,但经过进一步的调查,它在2.3中似乎工作得很好——这是一个完美的解决方案。