4

作業中のサイトのデータベースをレイアウトする方法を見つけようとしています。ここに私のモデルがあります:

class User
  include MongoMapper::Document

  // keys here

  many :items
  many :likes
end

class Item
  include MongoMapper::Document

  key :name, String, :required => true

  many :likes
end

class Like
  include MongoMapper::EmbeddedDocument

  key :user_id, String, :required => true
end

Likeどこかに埋め込む必要があると思いますが、取得したい機能があるため、選ぶのに苦労しています。

user = User.first
user.likes // should print out all the Items he liked

item = Item.first
item.likes // so I can count how many people like that item

findEmbeddedDocument を使用すると問題が発生しますが、 およびその他の便利なメソッドが失われ、両方のモデルに埋め込むことはできません。そのためItem、これを実行する必要があります (しかし実行できません):

item = Item.first
item.likes.find_by_user_id(User.first._id)

未定義のメソッドfind_by_user_idがスローされます。したがって、これを に埋め込む場合Userでも、これを行うことはできませんでした。

likes = Like.all // will throw undefined `all`

だから私はおそらくこのようにするという結論に達しました:

class Like
  include MongoMapper::Document

  key :user_id, String, :required => true
  key :item_id, String, :required => true

  belongs_to :user
  belongs_to :item
end

しかし、これは私がまだ古いMySQLの方法で物事をやろうとしているようです. MongoMapper を使用してこれをコーディングする最も可能性の高い方法について誰か教えてもらえますか?

前もって感謝します!

4

2 に答える 2

9

これを MongoMapper でモデル化できるかどうかは、Likeモデルに格納する必要があるデータがあるかどうかによって異なります。あなたの例のように、Likeモデルに関連付けられたデータがない場合、方法があります。MongoMapper の最新の更新では、まだ初期段階ですが、多対多の関係のサポートが追加されました。

次のようにモデルを作成します。

class User
  include MongoMapper::Document
  key :name, String, :required => true
  key :liked_item_ids, Array
  many :liked_items, :in => :liked_item_ids, :class_name => "Item"
end

class Item
  include MongoMapper::Document
  key :name, String, :required => true
  many :fans, :class_name => "User", :foreign_key => :liked_item_ids
end

次に、次のことができます。

>> u = User.new( :name => 'emily' )
>> i = Item.new( :name => 'chocolate' )
>> u.liked_items << i
>> u.save
>> u.liked_items
=> [#<Item name: "chocolate", _id: 4b44cc6c271a466269000001>]

>> i.fans
=> [#<User name: "emily", liked_item_ids: [4b44cc6c271a466269000001], _id: 4b44cc6c271a466269000002>]

残念ながら、この設定でできないことはItem、関係の側からいいね! を追加することです。many :inただし、GitHubには、この場合に使用されるリレーションシップの適切なリバースの作成に関する未解決の問題があります。次のようになります。

many :fans, :class_name => "User", :source => :liked_items

一方、Likeユーザーがアイテムを気に入った日付など、 に格納する必要がある情報がある場合、現在それをモデル化する方法はありません。この場合の理想的な設定 (現在 MongoMapper でサポートされているものは無視) は、質問に含めたものと似ています。Likeモデルに埋め込まれた3 つのモデルすべてUserと、からへhas_many :throughのリンクを作成するための関係が必要です。残念ながら、MongoMapper でのこれのサポートはおそらくかなり先のことです。UserItem

MongoMapper でのこのような動作のサポートを奨励したい場合は、メーリング リストで質問するか、 MongoMapper github リポジトリで問題を開くことができます。

于 2010-01-06T18:04:52.497 に答える
3

mongodb.org のドキュメント「Embed vs. Reference」を読むことをお勧めします: http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-Embedvs.Reference

于 2010-01-20T17:40:10.053 に答える