1

以下のように、Rails に NN 参照関係を持つ 2 つの 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"]>] 

ここで、ドライバ クラス (この場合は「バンド」) を更新するためにデータベースが呼び出されます。問題は、これらのインスタンスのどちらも保存されておらず、真新しいレコードであることです!

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]
4

1 に答える 1

0

.new() メソッドは保存しません。

代わりに .create() を使用してください。

band=Band.new() は Band クラスの新しいオブジェクトを作成しますが、持続しません。<< メソッドを使用してリレーションをプッシュすると、これら 2 つの新しいオブジェクト間のリレーションが作成されます。したがって、クエリを実行すると、これらの 2 つのオブジェクトは既に NN 関係にあります。ただし、それはこのコードの実行で生きているオブジェクトであり、実際にはデータとして永続化されていません。mongodb に保存するには、new() の代わりに .create() を使用して最初のオブジェクトを定義する必要があります。

のように見えるかもしれません

band=Band.create(name:"beetles")
band.tags << Tag.new(name:"rock")
于 2013-08-25T12:57:15.667 に答える