我正在运行Ruby on Rails 3.1。我阅读下面的文章和文档有关预先加载,我想找个做的事情正确的方法:渴望加载:正确的做事方式
- Eager Loading Associations【官方文档】
- ActiveRecord::Associations::ClassMethods(请参见“联想的预先加载” )【官方文档】
- Eager loading [博客文章]
的#2说:
注意使用条件像Post.includes([:作者:评论])。其中([ '?comments.approved =',真])所有可以产生意想不到的后果。
的#3说,这些意想不到的后果是:(注:例子是很相同的,所以我引用的博客文章的确切内容,但你必须记住具体的解决办法,而不是执行):
这个查询,因为它会使用一个LEFT JOIN,所以也会放弃所有没有任何评论的单词“first”的评论。
也就是说,如果存在非“关联”对象,则“主关联”对象将不会被加载。当我尝试使用加入一些条件像.where(:category_relationships => {:user_id => @current_user.id})
在我的previous question时,会发生这种情况,但我不希望发生这种情况。
所以(失败主义者,因为我可能不能在我的情况下条件不能在has_many
语句设置使用预先加载 - 请注意,在上面的代码@current_user.id
是存在于例子“动态设置”不像我想知道是否有pratiques /技术/战略,以限制数据库查询,因为我有一个“N + 1问题”。
也许这些pratiques /技术/策略是通过使用Ruby on Rails框架的所有可执行...的#1说:
即使活动记录可以让你在渴望 指定条件像加入一样加载关联,推荐的方法是使用 连接。
什么和如何解决这个问题的正确方法?
可能的解决方案是检索和建立自己需要运行特定分离数据库查询装载什么,但随后的问题就如何“通” /“副” /“插值”那些将“关联”对象检索到“主要关联”对象,以便那些可以使用“一种渴望加载”的方式?也就是说,如何使可能(请参阅mentioned question获取更多信息)使用类似@article.comments
之类的代码,并只获得我渴望加载自己的评论? 我的渴望加载,是否可能/正确使类似@article.comments = my_eager_loaded_comments
这样“传递”/“关联”/“插值”评论文章?
因为在我的情况下,我不能使用'has_many'关联,因为在我的情况下,我应该说''has_many,:conditions => ['user_id =?',@ current_user.id]'(*这是不可能的!* ...当然是我的知识)。因此,我想知道有关急切加载功能的解决方案。 – Backo 2012-03-12 23:54:04