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
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
- 1. Wie überwacht man eine bestehende Java-Klasse mit JMX?
- 2. Wie verwende ich MEF, damit Plugins bestehende Funktionen überschreiben können?
- 3. So entfernen Sie eine Ansicht einer anderen Klasse mit Ich habe bestehende Klasse aufgerufen
- 4. Wie kann ich eine bestehende Ordnerhierarchie mit CarrierWave reorganisieren?
- 5. Wie verwende ich eine ITK-Klasse in Python
- 6. Wie führe ich eine $ geoIntersects-Abfrage mit Mongoid durch?
- 7. Wie verwende ich die XmlReader-Klasse?
- 8. Wie verwende ich eine eigenständige Klasse in CakePHP 1.3?
- 9. Wie verwende ich eine .NET-Klasse in VBA? Syntax Hilfe!
- 10. Wie verwende ich Hash-Schlüssel als Methoden für eine Klasse?
- 11. Xamarin - Wie verwende ich eine Liste außerhalb seiner Klasse
- 12. Wie verwende ich Threading in einer Klasse?
- 13. Wie verfolge ich bestehende Verbindungen mit WebSockets
- 14. Wie verwende ich std.functional.memize in einer Klasse?
- 15. Wie kann man eine Methode aus ihrer Klasse (und in eine neue oder bestehende Klasse) ziehen?
- 16. Wie verwende ich eine abstrakte Klasse in einer anderen Klasse (oder einer Klasse)?
- 17. Wie verwende ich Django-Klasse-basierte UpdateViews mit FileFields
- 18. Wie mache ich eine bestehende Zweigstelle eine entfernte Niederlassung?
- 19. Store-Funktionen in Mongoid mit Mongoid 3
- 20. Wie schließe ich die Wurzel in meine JSON-Antworten ein, wenn ich Mongoid verwende?
- 21. Der Versuch, in Android eine abgeleitete Klasse für eine bereits bestehende Klasse zu machen
- 22. Java - Wie verwende ich eine Klassendatei?
- 23. Wie verwende ich Reflection, um eine Methode mit Parametern aufzurufen?
- 24. Wie bekomme ich die letzten N Dokumente mit Mongoid?
- 25. Wie verwende ich hasClass, um festzustellen, ob eine Klasse NICHT die gewünschte Klasse ist?
- 26. Wie verwende ich @IdClass mit JPA Repository?
- 27. Wie verwende ich Komposition mit Vererbung?
- 28. Wie verwende ich meine Logging-Klasse wie einen C++ - Standardstrom?
- 29. Klasse 'MongoId' nicht gefunden in Laradock Anwendung
- 30. Bestehende Klasse/Methode für vollqualifizierte Typname Parsen
ich die Klasse nicht ändern können. Es ist von einem Edelstein der dritten Partei. Kann ich Mongoid noch hinzufügen? – nilanjan
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
Ich möchte Tweets mit Mongoid mit dem Twitter-Juwel speichern: http://www.rubydoc.info/gems/twitter/Twitter/Tweet – nilanjan