2013-08-22 67 views
1

我在Rails的2 Mongoid文檔類與NN參照關係,如下圖所示:Mongoid查詢DB而在has_and_belongs_to_many關係相關聯的新的未保存記錄

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] 

回答

0

。新的()方法不保存。

改爲使用.create()。

band = Band.new()確實會創建Band類的新對象對象,但它不會持久。 當您使用<方法推送關係時,將創建這兩個新對象之間的關係。 因此,當您查詢時,這兩個對象已經處於N-N關係。 但是,那就是對象生活在這段代碼執行中,並沒有真正作爲數據持久化。 要將它保存在你的mongodb中,你需要用.create()而不是new()定義第一個對象。

它可能看起來像

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

看到我的最後一次更新給予一個可能的解決方案 –

相關問題