0

我有一个 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 这样做很难呢?

感谢你的帮助!

4

1 回答 1

0

就像@rubish 所说的那样,Devise 的 Trackable 模块会在每次登录或注销时保存 User 对象。它显式地使用了 save() 方法。但是为什么它不仅保存了用户,而且搜索了所有用户的关系并保存了它们呢?因为我有一个:

accepts_nested_attributes_for :admin_user, :publisher ...

就像 Mongoid 文档说的那样:

请注意,当使用 Accepts_nested_attributes_for 或验证关系的存在时,自动保存功能将自动添加到关系中。

所以自动保存,这不是 Mongoid 中的默认行为,因为那行代码而被启动。

我为解决这个问题所做的是将accept_nested_attributes_for放在我的每个配置文件模型中而不是 User 中。我必须更改使用嵌套配置文件创建用户的表单。现在表单创建了一个用户嵌套的配置文件。为此,我必须重写 Devise RegistrationsController 以不同方式创建资源模型。但这是另一个话题 =)

于 2013-10-01T13:58:50.503 回答