Mongoid在has_and_belongs_to_many关系中关联新的未保存记录时查询数据库

时间:2013-08-22 02:00:25

标签: ruby-on-rails performance mongodb many-to-many mongoid

我在Rails中有两个具有N-N引用关系的Mongoid文档类,如下所示:

class Band
  include Mongoid::Document
  field :name, type: String
  field :_id, type: String, default: ->{ name }  
  has_and_belongs_to_many :tags
end

class Tag
  include Mongoid::Document
  field :name, type: String
  field :_id, type: String, default: ->{ name }  
  has_and_belongs_to_many :bands
end

然后我创建每个实例并将它们关联起来:

2.0.0p247 :014 > band = Band.new(name: "beetles")
 => #<Band _id: beetles, name: "beetles", tag_ids: nil> 

2.0.0p247 :015 > tag = Tag.new(name: "rock")
 => #<Tag _id: rock, name: "rock", band_ids: nil> 

2.0.0p247 :016 > band.tags << tag
  MOPED: 127.0.0.1:27017 COMMAND      database=admin command={:ismaster=>1} (1.3745ms)
  MOPED: 127.0.0.1:27017 UPDATE       database=band_dev collection=bands selector={"_id"=>"beetles"} update={"$addToSet"=>{"tag_ids"=>{"$each"=>["rock"]}}} flags=[] (0.2341ms)
 => [#<Tag _id: rock, name: "rock", band_ids: ["beetles"]>] 

这里调用数据库来更新驱动程序类(在本例中为“band”)。问题是这些实例都没有保存并且是全新的记录!

2.0.0p247 :017 > band.new_record?
 => true 
2.0.0p247 :018 > tag.new_record?
 => true 

那么为什么要为未保存的文档执行db往返?有没有可以关闭它的设置?

版本信息:

mongoid (4.0.0 80ed36f)

moped (1.5.1)
origin (1.1.0)

bson (1.8.6)
bson_ext (1.8.6)

rails (4.0.0)

OS: Ubuntu 12.04 LTS

ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]

1 个答案:

答案 0 :(得分:0)

.new()方法不保存它。

改为使用.create()。

band = Band.new()会创建Band类的新对象,但它不会持久存在。 使用&lt;&lt;推送关系时方法,创建这两个新对象之间的关系。 因此,当您查询时,这2个对象已经处于N-N关系中。 但是,这是代码执行中的对象,并不是真正作为数据保留。 要将它保存在mongodb中,您需要使用.create()而不是new()来定义第一个对象。

可能看起来像

band=Band.create(name:"beetles")
band.tags << Tag.new(name:"rock")