Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Mongoid:如何仅加载通过引用延迟加载的对象的某些字段?_Ruby On Rails 3_Mongoid_Lazy Loading_Model Associations - Fatal编程技术网

Ruby on rails 3 Mongoid:如何仅加载通过引用延迟加载的对象的某些字段?

Ruby on rails 3 Mongoid:如何仅加载通过引用延迟加载的对象的某些字段?,ruby-on-rails-3,mongoid,lazy-loading,model-associations,Ruby On Rails 3,Mongoid,Lazy Loading,Model Associations,出于性能原因,我在编写mongoid查询时尽可能多地使用only()关键字来指定要加载的字段 通常的怀疑是,例如,当我想要一封我所有管理员的电子邮件仅用于显示目的时 我会写: User.where(:groups => :admins).only(:email).each do |u| puts u.email end 我之所以这样做,是因为我的用户模型中包含了大量的数据,在列出一大堆电子邮件时,我很乐意忽略这些数据 但是,现在让我们想象一下,我的用户是通过一个项目模型引用的,因此对于

出于性能原因,我在编写mongoid查询时尽可能多地使用
only()
关键字来指定要加载的字段

通常的怀疑是,例如,当我想要一封我所有管理员的电子邮件仅用于显示目的时

我会写:

User.where(:groups => :admins).only(:email).each do |u|
 puts u.email
end
我之所以这样做,是因为我的用户模型中包含了大量的数据,在列出一大堆电子邮件时,我很乐意忽略这些数据

但是,现在让我们想象一下,我的用户是通过一个项目模型引用的,因此对于每个项目,我都可以执行:
Project.user
。由于mongoid的延迟加载,我的对象用户只有在调用引用时才会被实例化(并从数据库中查询)

但是,如果我想列出所有管理项目所有者的所有电子邮件,例如

我将写下:

Project.where(:admin_type => true).each do |p|
  puts p.user.email
end
这里的主要问题是,这样做,我为每个项目加载整个用户对象,如果有很多项目与查询匹配,那么查询可能会非常繁重。那么,如何仅加载电子邮件

我可以这样做:

User.where(:_id => p.user_id).only(:email).first.email
但这显然违背了简单操作的良好语法的目的:

p.user.email 
我希望我能写一些像:
p.user.only(:email).email
,但我不能。有什么想法吗


Alex

我认为你需要在这里进行非规范化。首先,阅读


您可以通过自行使用mongoid事件或使用great gem来实现非规范化。它非常简单,在实现之后,您可以在查询中使用
p.user\u email
或其他内容。

我认为您需要在这里进行反规范化。首先,阅读


您可以通过自行使用mongoid事件或使用great gem来实现非规范化。它非常简单,在实现之后,您可以在查询中使用
p.user\u email
或其他内容。

来自Mongoid创建者的答案。这还不可能。它已作为功能请求添加。

来自Mongoid创建者的回答。这还不可能。它已作为功能请求添加。

谢谢,这是一个有趣的方法。我考虑过它(不是我不知道的mongoid_反规范化),而是一般的反规范化。我决定不使用它的原因是,很少需要显示项目的用户电子邮件,而且大多数用于内部管理界面。问题在于,它的分页包含了大量的项目,需要大量的用户负载。这就是为什么.only()可以解决我的特殊问题谢谢,这是一个有趣的方法。我考虑过它(不是我不知道的mongoid_反规范化),而是一般的反规范化。我决定不使用它的原因是,很少需要显示项目的用户电子邮件,而且大多数用于内部管理界面。问题在于,它的分页包含了大量的项目,需要大量的用户负载。这就是为什么一个.only()可以解决我的特殊问题,这个问题已经实现了吗?GitHub上是否存在此问题?此问题已通过pull命令添加。User.all.pull(:id)。这里要归功于@bosskovic,这项工作是否已经实施?GitHub上是否存在此问题?此问题已通过pull命令添加。User.all.pull(:id)。这里归功于@bosskovic