Можно ли создать модель и дочерние модели, используя Rails + MongoDB/Mongoid, используя только JSON?

Например, я хотел бы создать новый объект «Твит» из следующего 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.user» и т. д., сохраненные как встроенные дочерние модели. Анализ JSON и вставка этого просто дает объект «Tweet» с хэшем, сохраненным в свойстве сообщения.

Возможно ли то, чего я пытаюсь достичь? Если да, то как? а если нет, то возможно ли это другим способом?

Я использую Rails 3 и гем Mongoid для MongoDB.

Спасибо


person kombinat    schedule 07.03.2011    source источник
comment
это похоже на рубиновый хэш, а не на JSON. Может быть, преобразовать его с помощью .to_json   -  person sled    schedule 07.03.2011
comment
Извините, да. Я неправильно вставил. Это было после того, как он был преобразован из JSON в рубиновый хэш.   -  person kombinat    schedule 07.03.2011


Ответы (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)
person Jesse Wolgamott    schedule 07.03.2011

Если вы хотите, чтобы сообщение было собственным объектом, вам нужно либо внедрить, либо сослаться на другую модель, которая его определяет.

class Tweet
  include Mongoid::Document

  embeds_one :message
end

class Message
  include Mongoid::Document

  embedded_in :tweet

  field :place
  ...
end

Когда вы создаете атрибуты, вам нужно создать их так же, как вы бы отправили сообщение формы с вложенными атрибутами, и настроить свою модель, чтобы они принимались таким образом.

person Paul Elliott    schedule 07.03.2011
comment
Хорошо, спасибо, Пол. Просто чтобы подтвердить, невозможно просто вставить каплю JSON, мне придется создать объект вручную или, по крайней мере, манипулировать JSON, чтобы создать объекты... даже если у меня установлено «allow_dynamic_fields: true» в моем конфиге? - person kombinat; 07.03.2011
comment
После настройки этой ассоциации вроде все работает. Думаю, я надеялся, что все это может быть динамичным и мне не придется настраивать эти ассоциации. - person kombinat; 07.03.2011