Можно ли создать модель и дочерние модели, используя Rails + MongoDB/Mongoid, используя только JSON?
Например, я хотел бы создать новый объект Tweet из следующего JSON
{:for_user=>14248719, :message=>{:place=>nil, :user=>{:contributors_enabled=>false, :statuses_count=>217, :profile_use_background_image=>true, :friends_count=>3, :profile_background_color=>"C0DEED", :url=>nil, :following=>nil, :verified=>false, :profile_background_image_url=>"http://a3.twimg.com/a/1298748610/images/themes/theme1/bg.png", :time_zone=>nil, :favourites_count=>0, :profile_text_color=>"333333", :follow_request_sent=>nil, :profile_sidebar_fill_color=>"DDEEF6", :description=>"Lets get panda dev team rawk!", :id_str=>"95923128", :profile_background_tile=>false, :followers_count=>2, :created_at=>"Thu Dec 10 15:29:56 +0000 2009", :protected=>true, :profile_image_url=>"http://a2.twimg.com/profile_images/1121266473/panda01_normal.jpg", :is_translator=>false, :show_all_inline_media=>false, :geo_enabled=>false, :profile_link_color=>"0084B4", :location=>"Brighton", :name=>"letsgetpandadev", :listed_count=>0, :notifications=>nil, :profile_sidebar_border_color=>"C0DEED", :screen_name=>"letsgetpandadev", :id=>95923128, :lang=>"en", :utc_offset=>nil}, :favorited=>false, :coordinates=>nil, :text=>"another magic tweet", :in_reply_to_screen_name=>nil, :in_reply_to_user_id=>nil, :in_reply_to_status_id=>nil, :in_reply_to_status_id_str=>nil, :source=>"web", :contributors=>nil, :retweeted=>false, :in_reply_to_user_id_str=>nil, :id_str=>"44709765150015488", :retweet_count=>0, :created_at=>"Mon Mar 07 10:43:33 +0000 2011", :geo=>nil, :id=>44709765150015488, :entities=>{:urls=>[], :user_mentions=>[], :hashtags=>[]}, :truncated=>false}}
..и "message", "message.user" и т. д. сохраняются как встроенные дочерние модели. Разбор JSON и вставка, которая просто возвращает объект Tweet с хешем, сохраненным в свойстве сообщения.
Возможно ли то, что я пытаюсь достичь? Если так, то как? и если нет, было бы возможно через другой метод?
Я использую Rails 3 и монгоидный камень для MongoDB.
Спасибо
2 ответа
Конечно, вы можете - только не с обертками mongoid/mongomapper. Подключитесь через сам драйвер ruby ... Этот учебник содержит больше: http://api.mongodb.org/ruby/current/file.TUTORIAL.html
require 'rubygems'
require 'mongo'
db = Mongo::Connection.new.db("mydb")
test_collection = db.collection("testCollection")
doc = {"name" => "MongoDB", "type" => "database", "count" => 1,
"info" => {"x" => 203, "y" => 102}
}
test_collection.insert(doc)
Если вы хотите, чтобы сообщение было своим собственным объектом, то вам нужно будет либо внедрить, либо ссылаться на другую модель, которая его определяет.
class Tweet
include Mongoid::Document
embeds_one :message
end
class Message
include Mongoid::Document
embedded_in :tweet
field :place
...
end
Когда вы создаете атрибуты, вы захотите построить их так же, как вы разместили бы форму с вложенными атрибутами и настроить свою модель так, чтобы они принимались таким образом.