Mongomapper クエリ収集の問題
概要
ユーザー has_many ミーティングを定義すると、自動的に「user_id」が作成されます。 User コレクションに関連付けるキーと値のペア。何も走れないことを除けば mongo_mapper は、nil または [] を返さずに、この値を使用して検索します。
Meeting.first(:user_id => “1234”)
Meeting.all(:user_id => “1234”)
Meeting.find(:user_id => “1234”)
すべて nil を返します。別の構文はありますか?基本的に、自動生成された関連付けられた ObjectId に対してクエリを実行することはできません。
# Methods
class User
include MongoMapper::Document
key :user_name, String, :required => true
key :password, String
many :meetings
end
class Meeting
include MongoMapper::Document
key :name, String, :required => true
key :count, Integer, :default => 1
end
# Sinatra
get '/add' do
user = User.new
user.meetings "foobar") #should read: Meeting.new(:name => "foobar")
user.save
end
get '/find' do
test = Meeting.first(:user_id => "4b4f9d6d348f82370b000001") #this is the _id of the newly create user
p test # WTF! returns []
end
解決策
ジミーが Meeting.all の確認について述べたように、何もないと思います。
上記の例に基づいて、いくつかの潜在的な問題がわかります。 - ユーザーには :user_name が必要なので、保存されません - 必須の名前を設定していないため、保存されることはありません - 会議も保存されません - もう 1 つ、ミーティングを user.meetings に連結する必要があります。
これはmongo_mapper 0.6.10で動作します
require 'rubygems'
require 'mongo_mapper'
MongoMapper.database = "meetings"
class User
include MongoMapper::Document
key :user_name, String, :required => true
key :password, String
many :meetings
end
class Meeting
include MongoMapper::Document
key :name, String, :required => true
key :count, Integer, :default => 1
end
user = User.create(:user_name => "Rubyist")
user.meetings << Meeting.create(:name => "foobar")
user.save
Meeting.first(:user_id => user.id)
User.find(user.id).meetings
もうお気づきかもしれませんが、お役に立てば幸いです。