我有一个 rails 3/mongoid 应用程序,我使用 devise 登录,每次发生这种情况(登录或注销),不仅加载用户(我期望),而且它的所有配置文件(其中 4 个)也由 mongo 加载。像这样:
MOPED: 127.0.0.1:27017 QUERY database=asgard_development collection=advertisers selector={"$query"=>{"user_id"=>"51facd99615956fdb4000026"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.6170ms)
MOPED: 127.0.0.1:27017 QUERY database=asgard_development collection=publishers selector={"$query"=>{"user_id"=>"51facd99615956fdb4000026"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.7150ms)
MOPED: 127.0.0.1:27017 QUERY database=asgard_development collection=regular_users selector={"$query"=>{"user_id"=>"51facd99615956fdb4000026"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.5891ms)
MOPED: 127.0.0.1:27017 QUERY database=asgard_development collection=admin_users selector={"$query"=>{"user_id"=>"51facd99615956fdb4000026"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.6969ms)
这太多了!我想象 Devise 正在构建 User 对象及其所有关系。但这不应该是懒惰吗?
我的用户是这样的:
class User
##Includes begin
include Mongoid::Document
include Mongoid::Timestamps
include Roles
##Includes end
##Scopes begin
##Scopes end
##Constants begin
##Constants end
##Extras begin
# Include default devise modules. Others available are:
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :lockable, :registerable, :recoverable, :rememberable, :trackable, :validatable
##Extras end
##Relationships begin
has_one :admin_user
has_one :regular_user
has_one :publisher
has_one :advertiser
accepts_nested_attributes_for :admin_user, :regular_user, :publisher, :advertiser
我想避免在每次用户登录或注销时进行 n + 1(其中 n 是用户可以拥有的个人资料数量)查询。为什么设计/mongoid 这样做很难呢?
感谢你的帮助!