<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ASCIIcasts - Full Episode Feed</title>
    <description>The latest episodes from ASCIIcasts</description>
    <link>http://asciicasts.com/</link>
    <pubDate>Sun, 06 Jun 2010 23:54:10 +0000</pubDate>
    <ttl>1440</ttl>
    <item>
      <title>MongoDB e MongoMapper</title>
      <description>&lt;p&gt;&lt;a href="http://www.mongodb.org/display/DOCS/Home"&gt;MongoDB&lt;/a&gt; &amp;eacute; um banco de dados baseado em documento, que funciona de forma diferente dos tradicionais bancos de dados relacionais como o MySQL, este tipo de banco n&amp;atilde;o possui schema (schema-free).  Este epis&amp;oacute;dio ir&amp;aacute; cobrir o b&amp;aacute;sico do MongoDb com a &lt;a href="http://mongomapper.com/"&gt;gem MongoMapper&lt;/a&gt; para criar uma aplica&amp;ccedil;&amp;atilde;o simples em Rails. Muitos desenvolvedores Rails ouviram falar pela primeira vez sobre MongoDB ap&amp;oacute;s uma postagem de John Nunemaker em seu excelente &lt;a href="http://railstips.org/2009/12/18/why-i-think-mongo-is-to-databases-what-rails-was-to-frameworks"&gt;Blog RailsTips&lt;/a&gt; mostrando sete caracter&amp;iacute;sticas do MongoMapper e MongoDB que contrastam com os tradicionais bancos de dados relacionais. Este post vale a pena ser lido se voc&amp;ecirc; pensa que pode estar interessado em usar o MongoDB.&lt;/p&gt;

&lt;p&gt;Uma caracter&amp;iacute;stica mencionada na postagem do blog e que faz o MangoDB interessante  &amp;eacute; que voc&amp;ecirc; n&amp;atilde;o precisa usar migra&amp;ccedil;&amp;otilde;es, como ele &amp;eacute; basicamente um mecanismo(engine) de banco de dados sem esquema, cada linha &amp;eacute; seu pr&amp;oacute;prio documento, que pode ter seu pr&amp;oacute;prio conjunto de atributos diferentes das outras colunas no banco de dados. Como n&amp;atilde;o existe um esquema fixo n&amp;oacute;s podemos definir um se quisermos.&lt;/p&gt;

&lt;h3&gt;Instalando o MongoMapper e MongoDB&lt;/h3&gt;
&lt;p&gt;Para criar sua aplica&amp;ccedil;&amp;atilde;o vamos precisar primeiro instalar o MongoDB. O download para v&amp;aacute;rias plataformas pode ser encontrado na &lt;a href="http://www.mongodb.org/display/DOCS/Downloads"&gt;p&amp;aacute;gina de download&lt;/a&gt; no site do MongoDB. Se voc&amp;ecirc; est&amp;aacute; usando OS X h&amp;aacute; um &lt;a href="http://www.shiftcommathree.com/articles/how-to-install-mongodb-on-os-x"&gt;grande artigo&lt;/a&gt; de como instalar e configurar MongoDB no site do Cris Kampmeir&amp;rsquo;s. Este artigo inclui um arquivo &lt;code&gt;plist&lt;/code&gt; que ir&amp;aacute; permitir que voc&amp;ecirc; crie um LauchDemon para iniciar o MongoDB automaticamente ao iniciar o sistema.  O artigo faz referencia a uma vers&amp;atilde;o antiga do MongoDB ent&amp;atilde;o tenha certeza que voc&amp;ecirc; instalou a &amp;uacute;ltima vers&amp;atilde;o (1.2.0 no momento que escrevo isso). Uma vez que o MOngoDB esta instalado e configurado voc&amp;ecirc; pode visitar &lt;a href="http://localhost:28017/"&gt;http://localhost:28017/&lt;/a&gt; para ver se ele esta funcionando.&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="http://asciicasts.com/system/photos/275/original/E194I01.png" width="789" height="385" alt="" /&gt;
&lt;/div&gt;

&lt;h3&gt;Criando uma aplica&amp;ccedil;&amp;atilde;o Rails com MongoDB&lt;/h3&gt;

&lt;p&gt;Agora que n&amp;oacute;s temos o MongoDb instalado e rodando podemos come&amp;ccedil;ar a criar uma app Rails que ir&amp;aacute; trabalhar com ele. N&amp;oacute;s iremos criar uma nova app do zero para este epis&amp;oacute;dio chamada &lt;code&gt;todo&lt;/code&gt;.&lt;/p&gt;

&lt;pre class="terminal"&gt;
rails todo
&lt;/pre&gt;

&lt;p&gt;Iremos usar a gem MongoMapper para habilitar &amp;agrave; conversa de nossa app com o MongoDB. Para isto n&amp;oacute;s precisamos adicionar &amp;agrave; seguinte linha no bloco config de nosso &lt;code&gt;/config/environment.rb&lt;/code&gt;.&lt;/p&gt;
&lt;p class="codeFilePath"&gt;/config/environment.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
config.gem &amp;quot;mongo_mapper&amp;quot;
&lt;/pre&gt;
&lt;p&gt;N&amp;oacute;s tamb&amp;eacute;m precisamos alguma configura&amp;ccedil;&amp;atilde;o adicional que  fazeremos dentro do arquivo initializer. No diret&amp;oacute;rio &lt;code&gt;/config/initializers&lt;/code&gt; iremos criar um arquivo chamado &lt;code&gt;mongo_config.rb&lt;/code&gt;. Neste arquivo n&amp;oacute;s apenas precisamos adicionar uma linha para dizer ao MongoMapper qual banco de dados usar.&lt;/p&gt;
&lt;p class="codeFilePath"&gt;/config/initializers/mongo_config.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
MongoMapper.database = &amp;quot;todo-#{Rails.env}&amp;quot;  
&lt;/pre&gt;

&lt;p&gt;Ao passar o ambiente atual como parte do nome do banco de dados, vamos criar diferentes bancos de dados para nosso desenvolvimento, ambiente de teste e produ&amp;ccedil;&amp;atilde;o. Se fossemos mover esta aplica&amp;ccedil;&amp;atilde;o para produ&amp;ccedil;&amp;atilde;o n&amp;atilde;o haveria necessidade de fazer autentica&amp;ccedil;&amp;atilde;o e assim por diante, mas para prop&amp;oacute;sitos de demonstra&amp;ccedil;&amp;atilde;o esta &amp;oacute;tima.&lt;/p&gt;

&lt;p&gt;O passo final na configura&amp;ccedil;&amp;atilde;o de nossa aplica&amp;ccedil;&amp;atilde;o e rodar o seguinte comando para ter certeza que a gem MongoMapper esta instalada.&lt;/p&gt;

&lt;pre class="terminal"&gt;
sudo rake gems:install
&lt;/pre&gt;

&lt;h3&gt;Construindo nossa Aplica&amp;ccedil;&amp;atilde;o&lt;/h3&gt;


&lt;p&gt;Agora n&amp;oacute;s podemos come&amp;ccedil;ar a construir nossa aplica&amp;ccedil;&amp;atilde;o. Esta &amp;eacute; uma simples aplica&amp;ccedil;&amp;atilde;o todo list que ter&amp;aacute; um modelo &lt;code&gt;Project&lt;/code&gt; e cada &lt;code&gt;Project&lt;/code&gt; ir&amp;aacute; ter v&amp;aacute;rias tarefas(&lt;code&gt;Tasks&lt;/code&gt;). Para escrever mais facilmente nossa aplica&amp;ccedil;&amp;atilde;o iremos usar o &lt;a href="http://github.com/ryanb/nifty-generators"&gt;Nifty Gererators&lt;/a&gt; do Rayns Bates, mas essa aplica&amp;ccedil;&amp;atilde;o pode ser escrita sem ele.&lt;/p&gt;

&lt;p&gt;A primeira coisa que vamos fazer &amp;eacute; criar um layout para nossa aplica&amp;ccedil;&amp;atilde;o que podemos fazer rodando:&lt;/p&gt;

&lt;pre class="terminal"&gt;
script/generate nifty_layout
&lt;/pre&gt;

&lt;p&gt;A seguir vamos gerar um model e um scaffold para ele. &lt;code&gt;Project&lt;/code&gt; ir&amp;aacute; ter apenas um campo, nome, e como n&amp;atilde;o estamos gerando um model normal do ActiveRecord iremos passar a op&amp;ccedil;&amp;atilde;o &lt;code&gt;--skip-migraton&lt;/code&gt; para que nenhum arquivo de migra&amp;ccedil;&amp;atilde;o seja gerado.&lt;/p&gt;

&lt;pre class="terminal"&gt;
script/generate nifty_scaffold project name:string --skip-migration
&lt;/pre&gt;

&lt;p&gt;Isto ir&amp;aacute; gerar um arquivo de model, controller e view para n&amp;oacute;s. O modelo &lt;code&gt;Project&lt;/code&gt; gerado ir&amp;aacute; usar o ActiveRecord ent&amp;atilde;o termos que mudar para ele usar o MongoMapper.&lt;/p&gt;

&lt;pre class="ruby"&gt;
class Project &amp;lt; ActiveRecord::Base  
	attr_accessible :name  
end
&lt;/pre&gt;

&lt;p&gt;Tudo o que temos que fazer aqui &amp;eacute; fazer com que a classe pare de herdar de &lt;code&gt;ActiveRecord::Base&lt;/code&gt; e inclua o &lt;code&gt;MongoMapper::Document&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para definir atributos do modelo n&amp;oacute;s usamos o m&amp;eacute;todo &lt;code&gt;key&lt;/code&gt;. Passamos o nome do atributo, neste caso, &lt;code&gt;:name&lt;/code&gt;. e tambem o tipo que deve ser uma classe Ruby. Para nosso atributo &lt;code&gt;:name&lt;/code&gt; sera uma &lt;code&gt;String&lt;/code&gt;. Nosso modelo agora se parece com isto.&lt;/p&gt;
&lt;p class="codeFilePath"&gt;/app/models/project.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
	class Project  
	  include MongoMapper::Document  

	  key :name, String  
	end
&lt;/pre&gt;

&lt;p&gt;Com essa mudan&amp;ccedil;a fizemos no model n&amp;oacute;s podemos agora rodar nossa aplica&amp;ccedil;&amp;atilde;o e usar isto para criar, atualizar e listar os projetos como seria com uma aplicacao baseada em um banco de dados relacional e ActiveRecord, apenas ao inv&amp;eacute;s usando MongoMapper e MongoDB.&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
	&lt;img src="http://asciicasts.com/system/photos/276/original/E194I02.png" width="801" height="347" alt="" /&gt;
&lt;/div&gt;

&lt;p&gt;Em termos de interface o MongoMapper trabalha de maneira similar ao ActiveRecord. N&amp;oacute;s podemos realizar finds e creates, update e destroy nos registro como normalmente fazemos. Ele at&amp;eacute; suporta valida&amp;ccedil;&amp;otilde;es da mesma maneira como o ActiveRecord, ent&amp;atilde;o podemos adicionar:&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/project.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
	validates_presence_of :name  
&lt;/pre&gt;

&lt;p&gt;ao nosso model Project e n&amp;atilde;o permitir mais criar um projeto com o name em branco. Com o MongoMapper h&amp;aacute; uma maneira melhor para adicionar valida&amp;ccedil;&amp;otilde;es movendo-as para a mesma linha. Para fazer com que o atributo name seja obrigat&amp;oacute;rio podemos adicionar &lt;code&gt;:required =&amp;gt;&lt;/code&gt; true para os param&amp;ecirc;tros do m&amp;eacute;todo key.&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/project.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
	class Project  
	  include MongoMapper::Document  

	  key :name, String, :required =&amp;gt; true  
	end
&lt;/pre&gt;

&lt;h3&gt;Adicionando mais Atributos&lt;/h3&gt;

&lt;p&gt;Como o MongoDB &amp;eacute; um banco dados sem esquema podemos facilmente adicionar ou alterar atributos no model sem a necessidade de rodar qualquer migra&amp;ccedil;&amp;atilde;o. Se n&amp;oacute;s quisermos adicionar um atributo &lt;code&gt;priority&lt;/code&gt; em nosso &lt;code&gt;Project&lt;/code&gt; podemos simplesmente adicionar isto em nosso model.&lt;/p&gt;
&lt;p class="codeFilePath"&gt;/app/models/project.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
	class Project  
	  include MongoMapper::Document  

	  key :name, String, :required =&amp;gt; true  
	  key :priority, Integer  
	end
&lt;/pre&gt;

&lt;p&gt;N&amp;oacute;s podemos interar com este novo atribuito simplesmente como seria com o ActiveRecord. Ent&amp;atilde;o,na partial form de &lt;code&gt;Project&lt;/code&gt; podemos adicionar um menu select que ir&amp;aacute; permitir que n&amp;oacute;s selecionamos a prioridade quando formos criar ou atualizar um projeto.&lt;/p&gt;
&lt;p class="codeFilePath"&gt;/app/views/projects/_form.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;% form_for @project do |f| %&amp;gt;
  &amp;lt;%= f.error_messages %&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;%= f.label :name %&amp;gt;&amp;lt;br /&amp;gt;
    &amp;lt;%= f.text_field :name %&amp;gt;
  &amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;%= f.label :priority %&amp;gt;&amp;lt;br /&amp;gt;
    &amp;lt;%= f.select :priority, [1,2,3,4,5] %&amp;gt;
  &amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;&amp;lt;%= f.submit &amp;quot;Submit&amp;quot; %&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;% end %&amp;gt;
&lt;/pre&gt;

&lt;p&gt;N&amp;oacute;s temos que modificar a view &lt;code&gt;show&lt;/code&gt; para que possamos mostrar a prioridade de um projeto.&lt;/p&gt;


&lt;p class="codeFilePath"&gt;/app/views/projects/show.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;% title &amp;quot;Project&amp;quot; %&amp;gt;
&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Name:&amp;lt;/strong&amp;gt;
  &amp;lt;%=h @project.name %&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Priority:&amp;lt;/strong&amp;gt;
  &amp;lt;%=h @project.priority %&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;
  &amp;lt;%= link_to &amp;quot;Edit&amp;quot;, edit_project_path(@project) %&amp;gt; |
  &amp;lt;%= link_to &amp;quot;Destroy&amp;quot;, @project, :confirm =&amp;gt; &amp;#x27;Are you sure?&amp;#x27;, :method =&amp;gt; :delete %&amp;gt; |
  &amp;lt;%= link_to &amp;quot;View All&amp;quot;, projects_path %&amp;gt;
&amp;lt;/p&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Quando n&amp;oacute;s visitamos a p&amp;aacute;gina New Project agora podemos ver um menu select para a prioridade e quando criamos um novo projeto esta prioridade ir&amp;aacute; ser mostrada.&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
	&lt;img src="http://asciicasts.com/system/photos/277/original/E194I03.png" width="800" height="398" alt="" /&gt;
&lt;/div&gt;

&lt;p&gt;Como n&amp;oacute;s criamos um project antes de adicionarmos o atributo &lt;code&gt;priority&lt;/code&gt; voc&amp;ecirc; pode querer saber qual a prioridade que lhe foi atribu&amp;iacute;da. Se voc&amp;ecirc; olhar nesse projeto ver&amp;aacute; que a prioridade esta em branco. Como o valor de priority n&amp;atilde;o existe  para este documento o MongoDB ir&amp;aacute; dar valor nulo(&lt;code&gt;nil&lt;/code&gt;)&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
	&lt;img src="http://asciicasts.com/system/photos/278/original/E194I04.png" width="801" height="308" alt="" /&gt;
&lt;/div&gt;

&lt;h3&gt;Associa&amp;ccedil;&amp;otilde;es&lt;/h3&gt;

&lt;p&gt;Em nosso aplicativo Todo n&amp;oacute;s tamb&amp;eacute;m queremos ter um model &lt;code&gt;Task&lt;/code&gt;(Tarefas); cada &lt;code&gt;Project&lt;/code&gt; ir&amp;aacute; ter muitas &lt;code&gt;Tasks&lt;/code&gt;(Tarefas). Iremos gerar um scaffold para isto como fizemos antes para &lt;code&gt;Project&lt;/code&gt;. Note que &lt;code&gt;project_id&lt;/code&gt; &amp;eacute; uma string,  n&amp;oacute;s normalmente usamos um integer.&lt;/p&gt;

&lt;pre class="terminal"&gt;
script/generate nifty_scaffold task project_id:string name:string completed:boolean --skip-migration
&lt;/pre&gt;

&lt;p&gt;No model de &lt;code&gt;Project&lt;/code&gt; precisamos modificar o arquivo de modelo para trabalhar com o MongoMapper, substituindo o c&amp;oacute;digo especif&amp;iacute;co do ActiveRecord&lt;/p&gt;

&lt;pre class="ruby"&gt;
	class Task  
	  include MongoMapper::Document  

	  key :project_id, ObjectId  
	  key :name, String  
	  key :completed, Boolean  

	  belongs_to :project  
	end	
&lt;/pre&gt;


&lt;p&gt;Novamente teremos que incluir o &lt;code&gt;MongoMapper::Document&lt;/code&gt; e usar o m&amp;eacute;todo key para definir os atributos do modelo. Voc&amp;ecirc; pode ter esperado que o &lt;code&gt;project_id&lt;/code&gt; tivesse o tipo &lt;code&gt;Integer&lt;/code&gt;, mas o MongoDB usa &lt;code&gt;ObjectId&lt;/code&gt; para armazenar ids.&lt;/p&gt;

&lt;p&gt;Definimos o relacionamento de Taks&amp;#x27;s com Project como seria com o ActiveRecord usando o &lt;code&gt;belongs_to&lt;/code&gt;. Em &lt;code&gt;Project&lt;/code&gt; voc&amp;ecirc; pode esperar usar &lt;code&gt;has_many :tasks&lt;/code&gt;, mas para o MongoMapper usamos &lt;code&gt;many&lt;/code&gt;.&lt;/p&gt;
&lt;p class="codeFilePath"&gt;/app/models/project.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
	class Project  
	  include MongoMapper::Document  

	  key :name, String, :required =&amp;gt; true  
	  key :priority, Integer  

	  many :tasks  
	end
&lt;/pre&gt;

&lt;p&gt;N&amp;oacute;s podemos agora rodar o aplicativo e usar o controller e view gerados para criar novas tarefas. Entrar com o id do Project no formul&amp;aacute;rio de tasks ser&amp;aacute; complicado, embora o scaffold gerou um campo de texto para &lt;code&gt;project_id&lt;/code&gt;. Isto porque n&amp;oacute;s definimos ele como uma string quando  criamos o scaffold. Vamos modificar a view para que ela use um menu select permitindo &amp;agrave; escolha de qualquer Projeto existente. Da mesma forma que seria com um formul&amp;aacute;rio do ActiveRecord  podemos usar &lt;code&gt;collection_select&lt;/code&gt; para criar um menu select que vai listar todos os projetos.&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/tasks/_form.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;% form_for @task do |f| %&amp;gt;
  &amp;lt;%= f.error_messages %&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;%= f.label :project_id %&amp;gt;&amp;lt;br /&amp;gt;
    &amp;lt;%= f.collection_select :project_id, Project.all, :id, :name %&amp;gt;
  &amp;lt;/p&amp;gt;

  &amp;lt;!-- Rest of form... --&amp;gt;
&lt;/pre&gt;  

&lt;p&gt;Agora tempos um jeito f&amp;aacute;cil de selecionar um projeto quando estamos criando uma nova tarefa.&lt;/p&gt;
&lt;div class="imageWrapper"&gt;	
	&lt;img src="http://asciicasts.com/system/photos/279/original/E194I05.png" width="801" height="433" alt="" /&gt; 
&lt;/div&gt;

&lt;p&gt;Depois que n&amp;oacute;s termos uma nova tarefa criada, seremos redirecionados para a p&amp;aacute;gina dessa tarefa que ir&amp;aacute; mostrar o id do projeto. Seria melhor se pud&amp;eacute;ssemos mostrar o nome do Project ao inv&amp;eacute;s do &lt;code&gt;id&lt;/code&gt;. Podemos fazer isto substituindo &lt;code&gt;@task.project_id&lt;/code&gt; na view show por &lt;code&gt;@task.project.name&lt;/code&gt;&lt;/p&gt;


&lt;p class="codeFilePath"&gt;/app/views/tasks/show.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
	&amp;lt;% title &amp;quot;Task&amp;quot; %&amp;gt;

	&amp;lt;p&amp;gt;
	  &amp;lt;strong&amp;gt;Project:&amp;lt;/strong&amp;gt;
	  &amp;lt;%=h @task.project.name %&amp;gt;
	&amp;lt;/p&amp;gt;
	&amp;lt;!-- Rest of form --&amp;gt;
&lt;/pre&gt;


&lt;p&gt;O formul&amp;aacute;rio ir&amp;aacute; agora mostrar o nome do projeto associado, apenas como  seria com o ActiveRecord&lt;/p&gt;
&lt;div class="imageWrapper"&gt;	
	&lt;img src="http://asciicasts.com/system/photos/280/original/E194I06.png" width="801" height="350" alt="" /&gt;
&lt;/div&gt;

&lt;h3&gt;Finds no MongoDB&lt;/h3&gt;	


&lt;p&gt;N&amp;oacute;s vamos finalizar este epis&amp;oacute;dio mostrando algumas t&amp;eacute;cnicas para usar finds para models Mongo no console. Em alguns casos &amp;eacute; muito similar ao ActiveRecord. Por exemplo, podemos procurar todos( find all) projeto com &lt;code&gt;Project.all&lt;/code&gt;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt;&amp;gt; Project.all
=&amp;gt; [#&amp;lt;Project name: &amp;quot;Yardwork&amp;quot;, _id: 4b39d8c9a175750357000001, priority: nil&amp;gt;, #&amp;lt;Project name: &amp;quot;Housework&amp;quot;, _id: 4b39fbd1a175750357000002, priority: 3&amp;gt;]
&lt;/pre&gt;

&lt;p&gt;Podemos tamb&amp;eacute;m procurar um projeto por &lt;code&gt;id&lt;/code&gt;...&lt;/p&gt;

&lt;pre class="terminal"&gt;&amp;gt;&amp;gt; Project.find(&amp;#x27;4b39d8c9a175750357000001&amp;#x27;)
=&amp;gt; #&amp;lt;Project name: &amp;quot;Yardwork&amp;quot;, _id: 4b39d8c9a175750357000001, priority: nil&amp;gt;
&lt;/pre&gt;

&lt;p&gt;... ou fornecer op&amp;ccedil;&amp;otilde;es para procurar todos os registros em uma dada ordem.&lt;/p&gt;

&lt;pre class="terminal"&gt;&amp;gt;&amp;gt; Project.all(:order =&amp;gt; &amp;quot;name DESC&amp;quot;)
=&amp;gt; [#&amp;lt;Project name: &amp;quot;Yardwork&amp;quot;, _id: 4b39d8c9a175750357000001, priority: nil&amp;gt;, #&amp;lt;Project name: &amp;quot;Housework&amp;quot;, _id: 4b39fbd1a175750357000002, priority: 3&amp;gt;]
&lt;/pre&gt;

&lt;p&gt;Como o ActiveRecord n&amp;oacute;s podemos passar condi&amp;ccedil;&amp;otilde;es para o &lt;code&gt;find&lt;/code&gt;. Este difere do ActiveRecord em que as condi&amp;ccedil;&amp;otilde;es s&amp;atilde;o passadas inline ent&amp;atilde;o n&amp;oacute;s ir&amp;iacute;mos procurar todos os projetos com  prioridade 3:&lt;/p&gt;

&lt;pre class="terminal"&gt;&amp;gt;&amp;gt; Project.all(:priority =&amp;gt; 3)
=&amp;gt; [#&amp;lt;Project name: &amp;quot;Housework&amp;quot;, _id: 4b39fbd1a175750357000002, priority: 3&amp;gt;]
&lt;/pre&gt;

&lt;p&gt;E sobre as condi&amp;ccedil;&amp;otilde;es mais complexas? Como o Mongo n&amp;atilde;o &amp;eacute; baseado em SQL n&amp;atilde;o podemos simplesmente passar uma string SQL para a condi&amp;ccedil;&amp;atilde;o. Ao inv&amp;eacute;s ele tem sua pr&amp;oacute;pria linguagem para criar condi&amp;ccedil;&amp;otilde;es mais complexas. MongoMapper fornece um jeito conveniente para contornar isto passando um m&amp;eacute;todo para um s&amp;iacute;mbolo . Por exemplo, para pegar todos os projetos que tenham prioridade de dois ou mais, podemos fazer:&lt;/p&gt;


&lt;pre class="terminal"&gt;&amp;gt;&amp;gt; Project.all(:priority.gte =&amp;gt; 2)
=&amp;gt; [#&amp;lt;Project name: &amp;quot;Housework&amp;quot;, _id: 4b39fbd1a175750357000002, priority: 3&amp;gt;]
&lt;/pre&gt;

&lt;p&gt;N&amp;oacute;s podemos tamb&amp;eacute;m usar &lt;code&gt;in&lt;/code&gt;, passando um array de valores para o find, dizendo, projetos com a prioridade 2 ou 3.&lt;/p&gt;

&lt;pre class="terminal"&gt;&amp;gt;&amp;gt; Project.all(:priority.in =&amp;gt; [2,3])
=&amp;gt; [#&amp;lt;Project name: &amp;quot;Housework&amp;quot;, _id: 4b39fbd1a175750357000002, priority: 3&amp;gt;]
&lt;/pre&gt;
&lt;p&gt;A Documenta&amp;ccedil;&amp;atilde;o &amp;eacute; um pouco escassa sobre condi&amp;ccedil;&amp;otilde;es no momento, mas voc&amp;ecirc; pode descobrir mais sobre eles atrav&amp;eacute;s da leitura do &lt;a href="http://github.com/jnunemaker/mongomapper/blob/1831798fe3b8b2aea398435a4b1ea6f29f1a63c5/test/test_finder_options.rb"&gt;arquivo de test no github&lt;/a&gt;. Isto &amp;eacute; tudo por esse epis&amp;oacute;dio. N&amp;oacute;s apenas cobrimos o b&amp;aacute;sico do MongoDB e MongoMapper ent&amp;atilde;o voc&amp;ecirc; esta encorajado a fazer sua pr&amp;oacute;pria pesquisa se quiser continuar. A uma &lt;a href="http://groups.google.com/group/mongodb-user"&gt;maillgin list&lt;/a&gt; voc&amp;ecirc; pode se juntar a ela e voc&amp;ecirc; pode seguir o &lt;a href="http://twitter.com/mongodb"&gt;MongoDB no Twiiter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A grande quest&amp;atilde;o que voc&amp;ecirc; precisa fazer para si mesmo &amp;eacute;, devo usar MongoDb ao inv&amp;eacute;s de um tradicional bando de dados relacional? Isto realmente cabe a voc&amp;ecirc; pensar e decidir se o MongoDB &amp;eacute; apropriado para seu Projeto Rails. Mas voc&amp;ecirc; esta incentivado a dar uma chance para ver se ele se ajusta ao seu projeto. Em termos mais longos parece que os bancos de dados baseados em documentos ir&amp;atilde;o desempenhar um grande papel na constru&amp;ccedil;&amp;atilde;o de aplica&amp;ccedil;&amp;otilde;es Rails.&lt;/p&gt;</description>
      <pubDate>Sun, 10 Jan 2010 00:30:06 +0000</pubDate>
      <guid>http://pt.asciicasts.com/episodes/194-mongodb-e-mongomapper</guid>
      <link>http://pt.asciicasts.com/episodes/194-mongodb-e-mongomapper</link>
    </item>
  </channel>
</rss>
