Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

primeiros 5 caps

  • Loading branch information...
commit d22dc69bce99665fbf0a27534073f7f235409aed 1 parent 83ee4d6
caike authored
View
6 text/01_ActiveRecord/00.markdown
@@ -1,4 +1,4 @@
# ActiveRecord
-
-O Active Record é uma camada de mapeamento objeto-relacional (object-relational mapping layer), responsável pela interoperabilidade entre a aplicação e o banco de dados e pela abstração dos dados.
-(wikipedia)
+
+ActiveRecord is an object-relational mapping layer responsible for the interoperability among the application
+and the database and also responsible for data abstraction. (wikipedia)
View
14 text/01_ActiveRecord/01_sum.markdown
@@ -1,15 +1,15 @@
-## O método sum
+## The **sum** method
-### Expressões no método sum
-
-Agora podemos usar expressões em métodos de cálculo do **ActiveRecord**, como no método **sum**, por exemplo.
+### Expressions in the **sum** method
+
+Now we can use expressions in **ActiveRecord** methods that deal with calculation, like for example **sum**.
Person.sum("2 * age")
-### Alteração no retorno padrão do método sum
+### Change in the default return value of the sum method
-Nas versões anteriores, quando usávamos o método **sum** do **ActiveRecord** para calcular a soma de uma determinada coluna para todos os registros de uma tabela, e nenhum registro correspondia às condições expostas na execução do método, o retorno padrão era **nil**.
+In previous versions, when we used **ActiveRecord**'s **sum** method to calculate the result of the adition of all rows in a table and no row matched the conditions expressed during the method invocation, then the default return value would be **nil**.
-No Rails 2.1 o retorno padrão (quando nenhum registro é encontrado) é 0. Veja um exemplo:
+In Rails 2.1 the default return value (that is when no row is found) is 0. See the example:
Account.sum(:balance, :conditions => '1 = 2') #=> 0
View
28 text/01_ActiveRecord/02_has_one.markdown
@@ -1,8 +1,8 @@
## Has\_one
-### Suporte à opção through
+### Support for the option through
-O método **has\_one** recebeu suporte à opção **through**. Ele funciona exatamente como o **has_many :through**, mas para apenas um relacionamento. Exemplo:
+The method **has\_one** now has the option **through**. It works just like **has_many :through**, but it represents the association to a single **ActiveRecord** object.
class Magazine < ActiveRecord::Base
has_many :subscriptions
@@ -19,19 +19,19 @@ O método **has\_one** recebeu suporte à opção **through**. Ele funciona exat
:conditions => ['subscriptions.active = ?', true]
end
-### Has\_one com :source\_type
-
-O método **has\_one :through**, citado acima, também suporta a opção **:source\_type**. Vou tentar explicar isto através de exemplos. Vamos começar com estas duas classes:
+### Has\_one with :source\_type
+
+The method **has\_one :through**, just mentioned above, can also take **:source\_type**. I will try to explain this through some examples. Let's start with these two classes:
class Client < ActiveRecord::Base
has_many :contact_cards
has_many :contacts, :through => :contact_cards
end
+
+What we're looking at here is a **Client** class which **has_many** kinds of contacts, since the **ContactCard** class has a polymorphic relationship.
-O que nos interessa aqui é que tenho uma classe **Client** que possui (**has_many**) muitos contatos, que pode ser de qualquer tipo, já que a classe **ContactCard** possui um relacionamento polimórfico.
-
-Para seguir com nosso exemplo, vamos criar duas classes que representarão um **ContactCard**:
+Next step in our example, let's create two classes to represent a **ContactCard**.
class Person < ActiveRecord::Base
has_many :contact_cards, :as => :contact
@@ -40,14 +40,14 @@ Para seguir com nosso exemplo, vamos criar duas classes que representarão um **
class Business < ActiveRecord::Base
has_many :contact_cards, :as => :contact
end
-
-**Person** e **Business** estão relacionados com a minha classe **Client**, através da tabela **ContactCard**, ou seja eu tenho dois tipos de contatos, os pessoais e os de negócios. O problema é que isto não vai funcionar, veja o que acontece quando tento recuperar algum contato:
+
+**Person** e **Business** relate to my **Client** class through the **ContactCard** table. In other words, I have two kinds of contacts, personal and business. This is not going to work, however. Watch what happens when I try to retrieve a contact:
>> Client.find(:first).contacts
# ArgumentError: /…/active_support/core_ext/hash/keys.rb:48:
# in `assert_valid_keys’: Unknown key(s): polymorphic
-
-Para fazer isto funcionar teremos de usar a opção **:source_type**. Vamos alterar nossa classe **Client**:
+
+To make this work we have to use **:source_type**. Let's change our **Client** class:
class Client < ActiveRecord::Base
has_many :people_contacts,
@@ -60,8 +60,8 @@ Para fazer isto funcionar teremos de usar a opção **:source_type**. Vamos alte
:source => :contacts,
:source_type => :business
end
-
-Note que agora temos duas formas diferentes de recuperar nossos contatos, onde eu deixo claro qual tipo (**:source_type**) de contato estou esperando.
+
+Notice that we now have two different ways to retrieve our contacts and we can say what contact **:source_type** we are expecting.
Client.find(:first).people_contacts
Client.find(:first).business_contacts
View
24 text/01_ActiveRecord/03_named_scope.markdown
@@ -1,8 +1,8 @@
## Named_scope
-
-O gem *has\_finder* foi incorporado ao Rails, mas com um nome diferente: **named\_scope**.
-
-Para entender o que isto acrescentou de novo ao Rails veja os exemplos abaixo:
+
+The *has\_finder* gem has been added to Rails with a different name: **named\_scope**.
+
+To fully understand what this adition brought to Rails let's look at the following the examples:
class Article < ActiveRecord::Base
named_scope :published, :conditions => {:published => true}
@@ -13,8 +13,8 @@ Para entender o que isto acrescentou de novo ao Rails veja os exemplos abaixo:
Article.published.containing_the_letter_a.count
Article.containing_the_letter_a.find(:first)
Article.containing_the_letter_a.find(:all, :conditions => {…})
-
-Ao invés de criar um método **published** para retornar os posts já publicados, estou usando o **named\_scope** para fazer isto. Mas o método é um pouco mais robusto do que isto. Veja mais alguns exemplos de como ele pode ser usado:
+
+Instead of creating a new method named **published** to return all published posts, I'm using a **named\_scope** to do it for me. But it can go even further. Let's look at another example of how it can be used:
named_scope :written_before, lambda { |time|
{ :conditions => ['written_on < ?', time] }
@@ -31,11 +31,11 @@ Ao invés de criar um método **published** para retornar os posts já publicado
named_scope :multiple_extensions,
:extend => [MultipleExtensionTwo, MultipleExtensionOne]
-## Testando named\_scope com proxy\_options
-
-**Named scopes** é uma novidade muito interessante no Rails 2.1, mas após usar por um tempo este recurso, você pode descobrir que criar testes para estruturas mais complexas pode ser muito díficil.
+## Testing named\_scope with proxy\_options
+
+**Named scopes** is a very interesting new option for Rails 2.1, but after using it awhile you might have a hard time creating tests for more complex situations.
-Vamos pegar um exemplo:
+Let's look at an example:
class Shirt < ActiveRecord::Base
named_scope :colored, lambda { |color|
@@ -43,9 +43,9 @@ Vamos pegar um exemplo:
}
end
-Como criar um teste que valide a geração correta do escopo?
+How to create a test to validate the generation of the scope ?
-Para facilitar isto foi criado o método **proxy\_options**, que permite examinar as opções que estão sendo usadas no **named\_scope**. Para testar o exemplo acima, poderíamos fazer assim:
+To solve this issue, the method **proxy\_options** was created. It allows us to examine the options used in **named_scope**. To test the code above we could write:
class ShirtTest < Test::Unit
def test_colored_scope
View
8 text/01_ActiveRecord/04_increment_and_decrement.markdown
@@ -1,8 +1,8 @@
-## Increment e decrement
+## Increment and decrement
-Os métodos **increment**, **increment!**, **decrement** e **decrement!** do **ActiveRecord** receberam mais um parâmetro como opcional. Nas versões anteriores do Rails você podia usar estes métodos para aumentar ou diminuir o valor de uma coluna em 1 (um). Mas a partir desta versão você poderá especificar o valor a ser adicionado ou subtraído se desejar. Assim:
+**ActiveRecord**'s methods **increment**, **increment!**, **decrement** and **decrement!** can now take a new optional parameter. On previous verions of Rails you could use these methods to add or subtract 1 (one) from a given column. Now in Rails 2.1 you can tell which value that is to be added or subtracted. Like this:
player1.increment!(:points, 5)
player2.decrement!(:points, 2)
-
-No exemplo acima estou somando 5 à pontuação atual do jogador 1 e subtraindo 2 da pontuação atual do jogador 2. Como este parâmetro é opcional, os seus códigos antigos não serão afetados.
+
+In the above example I am adding 5 points to player1 and subtracting 2 points from player2. Since this is an optional parameter, legacy code is not affected.
View
40 text/01_ActiveRecord/05_find.markdown
@@ -1,30 +1,30 @@
## Find
### Conditions
-
-A partir de agora é possível passar um objeto como parâmetro no método **find** de uma classe **ActiveRecord**. Veja este caso como exemplo:
+
+From now on, one can pass an object as a parameter to **ActiveRecord**'s **find** method. See this example:
class Account < ActiveRecord::Base
composed_of :balance, :class_name => "Money", :mapping => %w(balance amount)
end
-
-Nesse caso, você pode passar um objeto **Money** como parâmetro no método **find** da classe **Account**, assim:
+
+In this case, you can pass a **Money** object as a parameter for the **find** method from the **Account** class, like this:
amount = 500
currency = "USD"
Account.find(:all, :conditions => { :balance => Money.new(amount, currency) })
### Last
+
+Up to now we could only use three operators to look for data using **ActiveRecord**'s **find** method. These are: **:first**, **:all** and the object's own id (in this case whe don't pass any argument to **find** besides the id itself)
-Até agora podíamos usar apenas três operadores para procurar dados usando o método **find** do **ActiveRecord**: **:first**, **:all** e o próprio id do objeto (neste caso não usamos um operador especifico, mas a falta de um significa que estamos passando o id).
-
-Agora teremos um quarto operador o **:last**. Veja alguns exemplos:
+Now there is a forth operator named **:last**. A few examples:
Person.find(:last)
Person.find(:last, :conditions => [ "user_name = ?", user_name])
Person.find(:last, :order => "created_on DESC", :offset => 5)
-
-Para entender como esse método foi implementado basta olhar um dos seus testes:
+
+To fully understand how this method works, just look at the following test:
def test_find_last
last = Developer.find :last
@@ -32,26 +32,26 @@ Para entender como esse método foi implementado basta olhar um dos seus testes:
end
### All
-
-O método estático **all** é um alias para o, também estático, **find(:all)**. Exemplo:
+
+The static method **all** is an alias to the also static **find(:all)**. Example:
- Topic.all é equivalente ao Topic.find(:all)
+ Topic.all is the same as Topic.find(:all)
### First
+
+The static method **first** is an alias to the also static **find(:first)**. Example:
-O método estático **first** é um alias para o, também estático, **find(:first)**. Exemplo:
-
- Topic.first é equivalente ao Topic.find(:first)
+ Topic.first is the same as Topic.find(:first)
### Last
-O método estático **last** é um alias para o, também estático, **find(:last)**. Exemplo:
-
- Topic.last é equivalente ao Topic.find(:last)
+The static method **last** is an alias to the also static **find(:last)**. Example:
+ Topic.last is the same as Topic.find(:last)
-## Usando os métodos first e last em named\_scope
+
+## Using **first** and **last** methods in named\_scope
-Os métodos mencionados acima também funcionam em **named\_scopes**. Imagine que eu criei um **named\_scope** chamado **recent**, então eu poderei fazer isto:
+All the methods mentioned above also work in **named\_scope**. Suppose we create a **named\_scope** named **recent**. The following is legal:
post.comments.recent.last
Please sign in to comment.
Something went wrong with that request. Please try again.