Ruby on rails Rails不填充与find(:include)的反向引用关联
使用相对较大的数据集时,我会遇到这样的情况:我需要使用关联的表加载数据,随后在这个过程中,关联的对象需要回调到第一个对象。但是,它似乎没有填充对对象的反向引用,因此即使使用:include,它也有许多sql查询 例如: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查询。一个用于加载所有电影,另
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中似乎工作得很好——这是一个完美的解决方案。