2016-04-09 10 views
0

Ich verwende eine Klasse aus einem Ruby Juwel. Ich möchte die Objekte, die von dem Edelstein in MongoDB zurückgegeben werden, mit Mongoid speichern. Ich möchte den Edelstein nicht verändern. Was muss ich tun, um die Objekte in MongoDB mit Mongoid zu speichern?Wie verwende ich eine bestehende Klasse mit Mongoid?

Antwort

1

Sie benötigen ein Mongo Modell wie:

class X 
    include Mongoid::Document 
    field Y, type: String 
    # etc etc 
end 

und dann müssen Sie das Modell von einem Objekt füllen Sie von diesem Gem haben wie:

X.create(Gem.output) 

Jetzt ist es innerhalb mongoid gespeichert ist . Ohne weitere Details zu kennen, kann ich keine Details mehr zu irgendwelchen Shortcuts angeben, sondern Conversions, die möglich sind.

aktualisiert basierend auf Kommentare:

Der einfachste Weg ist, um aufzustehen und laufen drücken Sie einfach jeden Twitter :: Tweet in eine Mongo Sammlung dynamic attributes verwenden. Dies ermöglicht es Ihnen, das komplette Objekt in mongodb zu speichern, ohne dass mongoid jedes Feld kennen muss.

Hier geht:

require 'twitter' 

client = Twitter::REST::Client.new do |config| 
    config.consumer_key  = "YOUR_CONSUMER_KEY" 
    config.consumer_secret  = "YOUR_CONSUMER_SECRET" 
    config.access_token  = "YOUR_ACCESS_TOKEN" 
    config.access_token_secret = "YOUR_ACCESS_SECRET" 
end 

Wir haben ein sehr einfaches Objekt definieren können unsere gespeicherten Daten darzustellen. Das 'include Mongoid :: Attributes :: Dynamic' erlaubt dynamische Felder.

Wenn wir die letzte Ehe von Justin Bieber speichern wollten, ist unten alles, was erforderlich ist. Beachten Sie die Verwendung von find_or_create_by, damit wir dies so oft laufen, wie wir wollen und nur eindeutige Datensätze in mongodb erstellen:

client.search("to:justinbieber marry me", result_type: "recent").take(1).collect{ |tweet| p Tweet.create(tweet) } 
=> [#<Tweet _id: 724763808288374784, created_at: "Tue Apr 26 00:55:32 +0000 2016", id_str: "724763808288374784", text: "@justinbieber marry me plz", entities: {"hashtags"=>[], "symbols"=>[], "user_mentions"=>[{"screen_name"=>"justinbieber", "name"=>"Justin Bieber", "id"=>27260086, "id_str"=>"27260086", "indices"=>[0, 13]}], "urls"=>[]}, truncated: false, metadata: {"iso_language_code"=>"en", "result_type"=>"recent"}, source: "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>", in_reply_to_status_id: nil, in_reply_to_status_id_str: nil, in_reply_to_user_id: 27260086, in_reply_to_user_id_str: "27260086", in_reply_to_screen_name: "justinbieber", user: {"id"=>454325860, "id_str"=>"454325860", "name"=>"Brandi Barton", "screen_name"=>"BrandiiBarton", "location"=>"", "description"=>"", "url"=>nil, "entities"=>{"description"=>{"urls"=>[]}}, "protected"=>false, "followers_count"=>413, "friends_count"=>238, "listed_count"=>2, "created_at"=>"Tue Jan 03 21:39:49 +0000 2012", "favourites_count"=>5385, "utc_offset"=>-14400, "time_zone"=>"Eastern Time (US & Canada)", "geo_enabled"=>true, "verified"=>false, "statuses_count"=>8462, "lang"=>"en", "contributors_enabled"=>false, "is_translator"=>false, "is_translation_enabled"=>false, "profile_background_color"=>"131516", "profile_background_image_url"=>"http://pbs.twimg.com/profile_background_images/720821701/7a6b6beb1d0f66066115cb44cdb7e445.png", "profile_background_image_url_https"=>"https://pbs.twimg.com/profile_background_images/720821701/7a6b6beb1d0f66066115cb44cdb7e445.png", "profile_background_tile"=>true, "profile_image_url"=>"http://pbs.twimg.com/profile_images/724069168912457728/cIEdUaLk_normal.jpg", "profile_image_url_https"=>"https://pbs.twimg.com/profile_images/724069168912457728/cIEdUaLk_normal.jpg", "profile_banner_url"=>"https://pbs.twimg.com/profile_banners/454325860/1460669660", "profile_link_color"=>"7739A6", "profile_sidebar_border_color"=>"000000", "profile_sidebar_fill_color"=>"EFEFEF", "profile_text_color"=>"333333", "profile_use_background_image"=>true, "has_extended_profile"=>true, "default_profile"=>false, "default_profile_image"=>false, "following"=>false, "follow_request_sent"=>false, "notifications"=>false}, geo: nil, coordinates: nil, place: nil, contributors: nil, is_quote_status: false, retweet_count: 0, favorite_count: 0, favorited: false, retweeted: false, lang: "en">] 

Einmal erstellt, bekommen wir es packen jede Suchmethode (find_by, zuerst, etc)

Tweet.first 
=> #<Tweet _id: 724763808288374784, created_at: "Tue Apr 26 00:55:32 +0000 2016", id_str: "724763808288374784", text: "@justinbieber marry me plz", entities: {"hashtags"=>[], "symbols"=>[], "user_mentions"=>[{"screen_name"=>"justinbieber", "name"=>"Justin Bieber", "id"=>27260086, "id_str"=>"27260086", "indices"=>[0, 13]}], "urls"=>[]}, truncated: false, metadata: {"iso_language_code"=>"en", "result_type"=>"recent"}, source: "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>", in_reply_to_status_id: nil, in_reply_to_status_id_str: nil, in_reply_to_user_id: 27260086, in_reply_to_user_id_str: "27260086", in_reply_to_screen_name: "justinbieber", user: {"id"=>454325860, "id_str"=>"454325860", "name"=>"Brandi Barton", "screen_name"=>"BrandiiBarton", "location"=>"", "description"=>"", "url"=>nil, "entities"=>{"description"=>{"urls"=>[]}}, "protected"=>false, "followers_count"=>413, "friends_count"=>238, "listed_count"=>2, "created_at"=>"Tue Jan 03 21:39:49 +0000 2012", "favourites_count"=>5385, "utc_offset"=>-14400, "time_zone"=>"Eastern Time (US & Canada)", "geo_enabled"=>true, "verified"=>false, "statuses_count"=>8462, "lang"=>"en", "contributors_enabled"=>false, "is_translator"=>false, "is_translation_enabled"=>false, "profile_background_color"=>"131516", "profile_background_image_url"=>"http://pbs.twimg.com/profile_background_images/720821701/7a6b6beb1d0f66066115cb44cdb7e445.png", "profile_background_image_url_https"=>"https://pbs.twimg.com/profile_background_images/720821701/7a6b6beb1d0f66066115cb44cdb7e445.png", "profile_background_tile"=>true, "profile_image_url"=>"http://pbs.twimg.com/profile_images/724069168912457728/cIEdUaLk_normal.jpg", "profile_image_url_https"=>"https://pbs.twimg.com/profile_images/724069168912457728/cIEdUaLk_normal.jpg", "profile_banner_url"=>"https://pbs.twimg.com/profile_banners/454325860/1460669660", "profile_link_color"=>"7739A6", "profile_sidebar_border_color"=>"000000", "profile_sidebar_fill_color"=>"EFEFEF", "profile_text_color"=>"333333", "profile_use_background_image"=>true, "has_extended_profile"=>true, "default_profile"=>false, "default_profile_image"=>false, "following"=>false, "follow_request_sent"=>false, "notifications"=>false}, geo: nil, coordinates: nil, place: nil, contributors: nil, is_quote_status: false, retweet_count: 0, favorite_count: 0, favorited: false, retweeted: false, lang: "en"> 

Wir können auch den Zugriff auf die eingebetteten Dokumente, wie Benutzer für den tweet bekommen, ohne etwas anderes dann spezifisch, es zu tun zu haben.

Tweet.first.user 
=> {"id"=>454325860, 
"id_str"=>"454325860", 
"name"=>"Brandi Barton", 
"screen_name"=>"BrandiiBarton", 
"location"=>"", 
"description"=>"", 
"url"=>nil, 
"entities"=>{"description"=>{"urls"=>[]}}, 
"protected"=>false, 
"followers_count"=>413, 
"friends_count"=>238, 
"listed_count"=>2, 
"created_at"=>"Tue Jan 03 21:39:49 +0000 2012", 
"favourites_count"=>5385, 
"utc_offset"=>-14400, 
"time_zone"=>"Eastern Time (US & Canada)", 
"geo_enabled"=>true, 
"verified"=>false, 
"statuses_count"=>8462, 
"lang"=>"en", 
"contributors_enabled"=>false, 
"is_translator"=>false, 
"is_translation_enabled"=>false, 
"profile_background_color"=>"131516", 
"profile_background_image_url"=>"http://pbs.twimg.com/profile_background_images/720821701/7a6b6beb1d0f66066115cb44cdb7e445.png", 
"profile_background_image_url_https"=>"https://pbs.twimg.com/profile_background_images/720821701/7a6b6beb1d0f66066115cb44cdb7e445.png", 
"profile_background_tile"=>true, 
"profile_image_url"=>"http://pbs.twimg.com/profile_images/724069168912457728/cIEdUaLk_normal.jpg", 
"profile_image_url_https"=>"https://pbs.twimg.com/profile_images/724069168912457728/cIEdUaLk_normal.jpg", 
"profile_banner_url"=>"https://pbs.twimg.com/profile_banners/454325860/1460669660", 
"profile_link_color"=>"7739A6", 
"profile_sidebar_border_color"=>"000000", 
"profile_sidebar_fill_color"=>"EFEFEF", 
"profile_text_color"=>"333333", 
"profile_use_background_image"=>true, 
"has_extended_profile"=>true, 
"default_profile"=>false, 
"default_profile_image"=>false, 
"following"=>false, 
"follow_request_sent"=>false, 
"notifications"=>false} 

Wir alle üblichen Methoden verwenden können, um Dokumente über die

Tweet.where('user.screen_name': 'BrandiiBarton').first.text 
=> "@justinbieber marry me plz" 

auch Daten basierend zu suchen und zu finden, ist es erwähnenswert, dass Mongoid nur ein Modell der dargestellten Daten ist. Das bedeutet, sobald wir die Daten in mongodb haben, könnten wir unser Mongod-Modell aktualisieren, um nur die Daten zu sehen, die wir wollten (während wir den Rest glücklich in mongodb lassen).

So, nachdem wir die Daten in verrohrt haben, konnten wir ein anderes Modell haben, wie:

class TwitterTweet 
    include Mongoid::Document 
    store_in collection:'tweets' # NB: mongoid pluralises class names as the collection name 

    field :text, type: String 

    embeds_one :user, class_name:'TwitterUser' 
end 

class TwitterUser 
    include Mongoid::Document 

    field :name, type: String 
    field :screen_name, type: String 

    embedded_in :TwitterTweets 
end 

Und wir die gleichen Daten abfragen können, nur dieses Mal können wir nur sehen und die Felder zugreifen, die wir habe angegeben.

TwitterTweet.first 
=> #<TwitterTweets _id: 724763808288374784, text: "@justinbieber marry me plz"> 

Wir können dann wie vor das eingebettete Dokument öffnen, aber es scoped wieder nur die Elemente, die wir (die anderen gibt es in der db, sind aber auf dieses Objekt gerade nicht sichtbar) definiert:

TwitterTweet.first.user 
=> #<TwitterUser _id: 571ed64a0da75753393f3db7, name: "Brandi Barton", screen_name: "BrandiiBarton"> 

In diesem Objekt verhindert Mongoid, dass wir mit Feldern spielen, die wir nicht sehen sollten, so wie ich die Anzahl der Freunde, die sie haben, nicht aktualisieren kann.

TwitterTweet.first.user.update_attributes(friends_count:30) 
=> Mongoid::Errors::UnknownAttribute 

Wo, wie in dem dynamischen Modell, wo ich uneingeschränkten Zugriff auf die Attribute haben, ich kann:

Tweet.first.user.update_attributes(friends_count:30) 
=> true 
+0

ich die Klasse nicht ändern können. Es ist von einem Edelstein der dritten Partei. Kann ich Mongoid noch hinzufügen? – nilanjan

+0

Die obige Klasse ist die MongoID-Klasse, die Sie definieren müssen. Wenn du aus deinem Juwel kommst, musst du es nicht ändern. Kann ich mit GEM fragen, das Sie verwenden, damit ich Ihnen ein Beispiel geben kann? – ABrowne

+0

Ich möchte Tweets mit Mongoid mit dem Twitter-Juwel speichern: http://www.rubydoc.info/gems/twitter/Twitter/Tweet – nilanjan

Verwandte Themen