这充满了问题,而不像我用SQL看到过的任何东西。我只是想创建一个HABTM关系并使对象相互匹配。
我的两个模特
class Word
include MongoMapper::Document
many :topics
key :word, String
end
class Topic
include MongoMapper::Document
many :words
key :name, String
end
单独的模型工作允许我创建对象并将它们关联起来。我喜欢Mongo的部分原因。
然后我尝试采取一些样本yaml:
Music I Dig:
reggae:
bob marley
isaac hayes
groundation
classical:
philip glass
bach
尝试用这个Rakefile解析它:
File.open(Rails.root + 'lib/words/disgusting_glass_full_of.yml', 'r') do |file|
YAML::load(file).each do |topic, word_types|
puts "Adding #{topic}.."
@temp_topic = Topic.create name: topic
@temp_words = word_types.map { |type, words|
words.split(' ').map{ |word|
@word = Word.create type: type, word: word
@word.topics << @temp_topic
}
}
@temp_topic.words << @temp_words.flatten
end
end
我不骗你,这是我见过的最随机,最奇怪的输出。 2创建的实际主题数量为空且没有数据。有些主题有关联,有些已完成。与单词相同。有些词会随机有关联,有些则不会。我找不到任何关于如何得出这个结果的联系。
我相信问题来自于我如何设置我的模型(也许?)。如果没有,我正在抛出mongo_mapper并尝试Mongoid。
答案 0 :(得分:4)
首先,您需要在模型中指定word_ids和topic_ids是数组属性:
class Topic
include MongoMapper::Document
many :words, :in => :word_ids
key :word_ids, Array
key :name, String
end
class Word
include MongoMapper::Document
many :topics, :in => :topic_ids
key :topic_ids, Array
key :word, String
end
您还必须确保在rake任务中保存主题和单词:
task :import => :environment do
File.open(Rails.root + 'lib/test.yml', 'r') do |file|
YAML::load(file).each do |topic, word_types|
puts "Adding #{topic}.."
temp_topic = Topic.create name: topic
temp_words = []
word_types.map do |type, words|
words.split(' ').map do |word|
word = Word.create type: type, word: word
word.topics << temp_topic
word.save
temp_words << word
end
end
temp_topic.words << temp_words.flatten
temp_topic.save
end
end
end
这给了我以下输出:
{
"_id" : ObjectId("502bc54a3005c83a3a000006"),
"topic_ids" : [
ObjectId("502bc54a3005c83a3a000001")
],
"word" : "groundation",
"type" : "reggae"
}
{
"_id" : ObjectId("502bc54a3005c83a3a000007"),
"topic_ids" : [
ObjectId("502bc54a3005c83a3a000001")
],
"word" : "philip",
"type" : "classical"
} ....etc
和
{
"_id" : ObjectId("502bc54a3005c83a3a000001"),
"word_ids" : [
ObjectId("502bc54a3005c83a3a000002"),
ObjectId("502bc54a3005c83a3a000003"),
ObjectId("502bc54a3005c83a3a000004"),
ObjectId("502bc54a3005c83a3a000005"),
ObjectId("502bc54a3005c83a3a000006"),
ObjectId("502bc54a3005c83a3a000007"),
ObjectId("502bc54a3005c83a3a000008"),
ObjectId("502bc54a3005c83a3a000009")
],
"name" : "Music I Dig"
}