LightMongo este un strat de persistenta al obiectului Mongo usor pentru Ruby, care foloseste caracteristicile lui Mongo, mai degraba decat sa incerce sa emuleze ActiveRecord.

stare

LightMongo este inca nou, dar toate exemplele de mai jos functioneaza. Va rugam sa verificati testele de integrare pentru indicatii de utilizare si sa postati orice probleme pe care le gasiti pe pagina cu probleme Github.

Instalare

LightMongo este cel mai bine instalat prin gem install light_mongo si este necesar in mod normal.

Depinde de gemul mongo, care este driverul MongoDB Ruby. Din motive de performanta, as recomanda instalarea mongo_ext, extensiile C pentru driver.

ACTUALIZARE : Se pare ca Kyle Banker a lansat o versiune 1.0 a soferului Ruby Mongo. Acest lucru este minunat, dar, din pacate, rupe o gramada de LightMongo. Nu pot garanta niciun mediu mai nou decat Ruby 1.8.6 si mongo 0.19.1 pentru moment.

Sine

Va rugam sa consultati LightMongo-Rails pentru o punte compatibila cu ActionPack.

Problema

Dezvoltatorii intalnesc ocazional un domeniu care sfideaza modelarea simpla intr-un stil relational ActiveRecord si cauta o solutie in unele baze de date nosql. Ei gasesc Mongo, o baza de date de documente si considera ca ar putea oferi flexibilitatea de care au nevoie. Dupa un pic de cercetare, ei aleg o biblioteca de persistenta care pare populara si bine intretinuta. Emuleaza chiar si majoritatea comportamentului, stilului si filozofiei relationale a ActiveRecord. Grozav!

Stai putin, nu a fost comportamentul, stilul si filozofia relationala a ActiveRecord din care s-au mutat la Mongo pentru a scapa?

Solutia

  • Instantele Ruby isi stocheaza starea in variabile de instanta. De ce trebuie sa ascundem acest lucru in stratul de persistenta?
  • Ruby are o gramada de operatori de management de matrice. De ce avem nevoie de relatii explicite si proxy-uri de relatii?
  • Obiectele din aceeasi clasa pot indeplini o serie de roluri diferite sau pot fi legate de alte clase in multe feluri. De ce trebuie sa trecem prin cercuri complicate si restrictive pentru a face tot ceea ce facem in domenii Ruby pure tot timpul?

Mongo este o baza de date flexibila. Putem folosi aceasta flexibilitate pentru a permite stratului nostru de persistenta sa ia decizii cu privire la modul de serializare si deserializare a obiectelor noastre. Este responsabilitatea noastra sa ne asiguram ca domeniul nostru este corect. Este responsabilitatea bibliotecii sa stocheze acele obiecte de domeniu.

Suntem dezvoltatori Ruby. Sa ne comportam asa.

Un exemplu

require ‘rubygems’ require ‘light_mongo’ class Articolul include LightMongo :: Document end geology_article = Article.new (: title => ‘Fluid Physics in Geology’,: abstract => ‘Lorem ipsum dolor .

masaje final feliz jovenes zorras
porno caca follada por su jefe
porno maduras en español comic maduras
porno casero españa mamadas a dos bocas
tetas en la playa pollones enormes
intercambio amateur mama incesto
porno comic español se folla a su hijo
videos gays españoles porno españa casero
negros follando a blancas humillada y follada
chochitos jovencitos follame xxx
guarras españolas porno iberico
chantaje y lujuria porno maduras en español
las mejores folladas penes negros
videos de sexo en español peliculas porno de viejas
muy maduras follando mamas cachondas
hentai audio español abuelos calientes
pollas arabes porno de abuelas
descargar pelis pornos milf squirt
Keyword mi vecina me folla
abuelas porno porno agresivo

.’) geology_article.save Article. find.first => # <Article: 0x101647448 @ _id = “4b93c1e97bc7697187000001” @ title = “Fizica fluidelor in geologie” @ abstract = “Lorem upsum dolor …”>

Fara mese. Nicio baza de date. Salvati migratiile pentru cand aveti de fapt unele date pentru a va deplasa.

Putin mai complex

Obiectele Plain Ruby stocate in Documentele dvs. vor fi serializate impreuna cu Documentul si incorporate in documentul Mongo.

class Article include LightMongo :: Document attr_accessor: title,: comments def initialize (* args) @comments = [] super end end class Comentariu attr_accessor: author_name,: text end geology_article = Article.create (: title => ‘Fluid Physics in Geologie ‘) comentariu = Comment.new comment.author_name =’ Dave ‘comment.text = “Articol minunat!” geology_article.comments << comentariu geology_article.save first_article = Article.find.first first_article.title => “Fizica fluidelor in geologie” first_article.comments => [# <Comment: 0x101664138 @ author_name = “Dave” @ text = “Cool article ! “>]

Cautatori dinamici

In general, nu este o idee buna sa cautati mult pe chei care nu au fost indexate (ca in majoritatea bazelor de date), asa ca LightMongo va configura doar cautatori dinamici pentru atributele pe care ati cerut sa le indexati. Daca doriti cu adevarat un cautator neindexat, nu sunt greu de scris.

class Articolul include LightMongo :: Document attr_reader: page_length index: title index: abstract,: as =>: precis end geology_article = Article.create (: title => ‘Fluid Physics in Geology’,: abstract => ‘Un studiu in fizica fluidelor “,: page_length => 367) Article.find_by_title (” Fizica fluidelor in geologie “). first == geology_article => true Article.find_by_precis (” A study on geological fluid physics “). first == geology_article => true

Optiunea de aliasare nu este necesara, dar este recomandata daca doriti cautatori dinamici pentru cheile indexate care nu pot fi reprezentate intr-un nume standard al metodei Ruby (de exemplu, nu va fi creat un cautator pentru un index complex de chei Mongo pe mai multe niveluri. Consultati manualul Mongo pentru mai multe informatii).

Relatii de colectare incrucisata

LightMongo isi foloseste mixul de documente pentru a semnifica o colectie, deci daca incorporati un LightMongo :: Document intr-un alt document LightMongo :: Document, motorul de serializare va considera aceasta o relatie de colectare incrucisata si se va comporta in consecinta.

class Article include LightMongo :: Document attr_reader: author end class Person include LightMongo :: Document end dave = Person.new (: name => ‘Dave’) fluid_physics = Article.create (: title => ‘Fluid Physics in Geology’, : author => dave) Person.find.first => # <Person: 0x101664138 @ _id = “4b93cf9397bc7697187000001” @ name = “Dave”> Article.find.first.author == Person.find.first => true

Dezvoltare viitoare

  1. Migratii (de exemplu, cand redenumiti clasele sau modificati stilul lor de colectare).
  2. Un fel de validari, poate.