<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Carcara Weblog!</title>
    <link>http://carcara.railsplayground.com/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Carcara Weblog!</description>
    <item>
      <title>Polymorphic Associations</title>
      <description>&lt;p&gt;Pessoal uma coisa interessante e seimples de fazer que eu vi no rails e queria compartilhar com vocês são as &amp;#8220;associações polimórficas&amp;#8221;.&lt;/p&gt;


&lt;h3&gt;O que é uma associação polimórfica?&lt;/h3&gt;

	&lt;p&gt;Uma associação polimórfica é quando uma tabela pode ser relacionada pelo mesmo caminho a diversas outras. Por exemplo, você tem uma tabela de fornecedores, uma de clientes e uma de números de telefone e essa tabela de telefones tem uma unica associação chamada dono_do_telefone, que hora pode ser um fornecedor, hora pode ser um cliente.&lt;/p&gt;


	&lt;p&gt;Antes de conhecer o rails e essa solução eu faria uma coisa realmente feia para resolver esse problema, por isso nem vou comentar aqui.&lt;/p&gt;


&lt;h3&gt;Botando a mão na massa&lt;/h3&gt;

	&lt;p&gt;Vamos ver como  fica isso no rails.&lt;/p&gt;


	&lt;p&gt;Primeiro vou apresentar a vocês o meu PC. Ele se chama Yoda. Porque de tão velhinho ele me lembra o &amp;#8220;Mestre Yoda&amp;#8221; de guerra nas estrelas.&lt;/p&gt;


	&lt;p&gt;Então abaixo eu vou gerar os 3 migrates para criar as tabelas que preciso.&lt;/p&gt;


&lt;pre style="overflow: auto"&gt;
(coutinho@yoda - ~/workspace/teste @01:09:05) 
0: script/generate model cliente
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/cliente.rb
      create  test/unit/cliente_test.rb
      create  test/fixtures/clientes.yml
      exists  db/migrate
      create  db/migrate/001_create_clientes.rb
&lt;/pre&gt;

	&lt;p&gt;Nossa, passa de 1 da manha então para eu não passar a noite toda aqui repitam o passo acima para criar os models de fornecedores e telefones.&lt;/p&gt;


	&lt;p&gt;Uma dica, para fornecedor usem o inflect para informar o plural correto da palavra de forma que o rails não use fornecedors ao invés de fornecedores.&lt;/p&gt;


	&lt;p&gt;Abaixo temos os migrates de nossas 3 tabelas:&lt;/p&gt;


&lt;pre style="overflow: auto"&gt;
class CreateClientes &amp;lt; ActiveRecord::Migration
  def self.up
    create_table :clientes do |t|
        t.column :nome, :string
    end
  end

  def self.down
    drop_table :clientes
  end
end

class CreateFornecedores &amp;lt; ActiveRecord::Migration
  def self.up
    create_table :fornecedores do |t|
        t.column :nome_fantasia, :string
    end
  end

  def self.down
    drop_table :fornecedores
  end
end

class CreateTelefones &amp;lt; ActiveRecord::Migration
  def self.up
    create_table :telefones do |t|
        t.column :dono_telefone_id, :integer
        t.column :dono_telefone_type, :string
        t.column :fone, :string
    end
  end

  def self.down
    drop_table :telefones
  end
end
&lt;/pre&gt;

Após isso vamos rodar um:
&lt;pre style="overflow: auto"&gt;
(coutinho@yoda - ~/workspace/teste @01:09:22) 
0: rake db:migrate
&lt;/pre&gt;

	&lt;p&gt;Vamos agora mapear o relacionamento em nossos models.&lt;/p&gt;


Vamos ver como ficaria o model de cliente:
&lt;pre style="overflow: auto"&gt;
class Cliente &amp;lt; ActiveRecord::Base
    has_many :telefones
end
&lt;/pre&gt;

No model de fornecedores faremos exatamnte a mesma coisa, vejam:
&lt;pre style="overflow: auto"&gt;
class Fornecedor &amp;lt; ActiveRecord::Base
    has_many :telefones
end
&lt;/pre&gt;

	&lt;p&gt;O código acima não em segredo e conhecido de quem já leu o mmínimo de rails, o segredo da associação polimórfica então está no nosso model telefone.&lt;/p&gt;


Vamos conferir:
&lt;pre style="overflow: auto"&gt;
class Telefone &amp;lt; ActiveRecord::Base
   belongs_to :dono_telefone, :polymorphic =&amp;gt; :true
end
&lt;/pre&gt;

	&lt;p&gt;Nossa, que segredão. Com o parâmetro :polymorphic que usamos no belongs_to o rails sabe que o nossa relação é &amp;#8220;mutante&amp;#8221; então para saber qual é o tipo de objeto ao qual realmente o telefone vai estar associado o active record vai usar aquele campo dono_telefone_type para gravar o nome da associação quando gravar-mos um registro e vai usa-lo tambem na hora em que tentar-mos ler uma associação já gravada.&lt;/p&gt;


&lt;h3&gt;Será que isso funciona?&lt;/h3&gt;
Vamos ver como fica isso no console:

&lt;pre style="overflow: auto"&gt;
(coutinho@yoda - ~/workspace/teste @01:24:24) 
1: script/console 
Loading development environment.
&amp;gt;&amp;gt; c = Cliente.create(:nome =&amp;gt; 'Coutinho')
=&amp;gt; #&amp;lt;Cliente:0xb764ab24 @errors=#&amp;lt;ActiveRecord::Errors:0xb75d9f00 @errors={}, @base=#&amp;lt;Cliente:0xb764ab24 ...&amp;gt;&amp;gt;, @attributes={"nome"=&amp;gt;"Coutinho", "id"=&amp;gt;1}, @new_record=false, @new_record_before_save=true&amp;gt;
&amp;gt;&amp;gt; t = Telefone.new(:fone =&amp;gt; '8588885555')
=&amp;gt; #&amp;lt;Telefone:0xb75c79b8 @attributes={"dono_telefone_id"=&amp;gt;nil, "fone"=&amp;gt;"8588885555", "dono_telefone_type"=&amp;gt;nil}, @new_record=true&amp;gt;
&amp;gt;&amp;gt; t.dono_telefone = c
=&amp;gt; #&amp;lt;Cliente:0xb764ab24 @errors=#&amp;lt;ActiveRecord::Errors:0xb75d9f00 @errors={}, @base=#&amp;lt;Cliente:0xb764ab24 ...&amp;gt;&amp;gt;, @attributes={"nome"=&amp;gt;"Coutinho", "id"=&amp;gt;1}, @new_record=false, @new_record_before_save=true&amp;gt;
&amp;gt;&amp;gt; t.save
=&amp;gt; true
&amp;gt;&amp;gt; t
=&amp;gt; #&amp;lt;Telefone:0xb75c79b8 @errors=#&amp;lt;ActiveRecord::Errors:0xb759e180 @errors={}, @base=#&amp;lt;Telefone:0xb75c79b8 ...&amp;gt;&amp;gt;, @dono_telefone=#&amp;lt;Cliente:0xb764ab24 @errors=#&amp;lt;ActiveRecord::Errors:0xb75d9f00 @errors={}, @base=#&amp;lt;Cliente:0xb764ab24 ...&amp;gt;&amp;gt;, @attributes={"nome"=&amp;gt;"Coutinho", "id"=&amp;gt;1}, @new_record=false, @new_record_before_save=true&amp;gt;, @attributes={"dono_telefone_id"=&amp;gt;1, "fone"=&amp;gt;"8588885555", "id"=&amp;gt;1, "dono_telefone_type"=&amp;gt;"Cliente"}, @new_record=false&amp;gt;
&amp;gt;&amp;gt; t.dono_telefone
=&amp;gt; #&amp;lt;Cliente:0xb764ab24 @errors=#&amp;lt;ActiveRecord::Errors:0xb75d9f00 @errors={}, @base=#&amp;lt;Cliente:0xb764ab24 ...&amp;gt;&amp;gt;, @attributes={"nome"=&amp;gt;"Coutinho", "id"=&amp;gt;1}, @new_record=false, @new_record_before_save=true&amp;gt;
&amp;gt;&amp;gt; 
&lt;/pre&gt;

	&lt;p&gt;Vamos traduzir o que aconteceu acima:&lt;/p&gt;


&lt;ol&gt;
&lt;li&gt;Criei um cliente chamado Coutinho&lt;/li&gt;
&lt;li&gt;Criei um numero de telefone&lt;/li&gt;
&lt;li&gt;Associei o número de telefone ao cliente recem criado usando: &amp;#8220;t.dono_telefone = c&amp;#8221;&lt;/li&gt;
&lt;li&gt;Salvei e conferi o resultado :)&lt;/li&gt;
&lt;/ol&gt;

	&lt;p&gt;O processo parece óbvio, e é. Porém o rails não conseguia depois encontrar o dono_telefone para esse registro se não tivesse sido informado o tipo da classe (do objeto) que você está relacionando.&lt;/p&gt;


	&lt;p&gt;Para quem não reparou os atributos do registro telefone:&lt;/p&gt;


&lt;pre style="overflow: auto"&gt;
 @attributes={"dono_telefone_id"=&amp;gt;1, "fone"=&amp;gt;"8588885555", "id"=&amp;gt;1, "dono_telefone_type"=&amp;gt;"Cliente"}
&lt;/pre&gt;
Vamos fazer agora nosso teste com fornecedor e conferir o resultado final se funciona mesmo.

&lt;pre style="overflow: auto"&gt;
&amp;gt;&amp;gt; f = Fornecedor.create(:nome_fantasia =&amp;gt; 'Coutinho Comércio e Importação')
=&amp;gt; #&amp;lt;Fornecedor:0xb75398c0 @errors=#&amp;lt;ActiveRecord::Errors:0xb7533f9c @errors={}, @base=#&amp;lt;Fornecedor:0xb75398c0 ...&amp;gt;&amp;gt;, @attributes={"id"=&amp;gt;1, "nome_fantasia"=&amp;gt;"Coutinho Comércio e Importação"}, @new_record=false, @new_record_before_save=true&amp;gt;
&amp;gt;&amp;gt; tt = Telefone.new(:fone =&amp;gt; '85 é o DDD do ceará')
=&amp;gt; #&amp;lt;Telefone:0xb751b8d4 @attributes={"dono_telefone_id"=&amp;gt;nil, "fone"=&amp;gt;"85 é o DDD do ceará", "dono_telefone_type"=&amp;gt;nil}, @new_record=true&amp;gt;
&amp;gt;&amp;gt; tt.dono_telefone = f
=&amp;gt; #&amp;lt;Fornecedor:0xb75398c0 @errors=#&amp;lt;ActiveRecord::Errors:0xb7533f9c @errors={}, @base=#&amp;lt;Fornecedor:0xb75398c0 ...&amp;gt;&amp;gt;, @attributes={"id"=&amp;gt;1, "nome_fantasia"=&amp;gt;"Coutinho Comércio e Importação"}, @new_record=false, @new_record_before_save=true&amp;gt;
&amp;gt;&amp;gt; tt.save
=&amp;gt; true
&amp;gt;&amp;gt; tt.dono_telefone
=&amp;gt; #&amp;lt;Fornecedor:0xb75398c0 @errors=#&amp;lt;ActiveRecord::Errors:0xb7533f9c @errors={}, @base=#&amp;lt;Fornecedor:0xb75398c0 ...&amp;gt;&amp;gt;, @attributes={"id"=&amp;gt;1, "nome_fantasia"=&amp;gt;"Coutinho Comércio e Importação"}, @new_record=false, @new_record_before_save=true&amp;gt;
&amp;gt;&amp;gt; 
&lt;/pre&gt;

	&lt;p&gt;Dessa vez acredito que nao precisa de tradução.&lt;/p&gt;


	&lt;p&gt;Só como uma brincadeirinha final agora quem quizer pode tentar rodar esse código no console:&lt;/p&gt;


&lt;pre style="overflow: auto"&gt;
for tel in Telefone.find_all
  if tel.dono_telefone_type=='Cliente'
    puts "O dono do telefone '#{tel.fone}' é o cliente: #{tel.dono_telefone.nome}" 
  else
    puts "O dono do telefone '#{tel.fone}' é o fornecedor: #{tel.dono_telefone.nome_fantasia}"  
    end
end    
&lt;/pre&gt;

	&lt;p&gt;Até a próxima pessoal.&lt;/p&gt;</description>
      <pubDate>Sat, 21 Apr 2007 18:11:00 PDT</pubDate>
      <guid>http://carcara.railsplayground.com/articles/2007/04/21/polymorphic-associations</guid>
      <link>http://carcara.railsplayground.com/articles/2007/04/21/polymorphic-associations</link>
      <trackback:ping>http://carcara.railsplayground.com/articles/trackback/9</trackback:ping>
    </item>
    <item>
      <title>SQL - Select de 600 linhas</title>
      <description>&lt;p&gt;Essa semana um velho conhecido da lista de usuarios de postgresql veio me mostrar uma coisa interessante, uns select de 600 linhas que mais parecem funcoes escritas em pl/pgsql.&lt;/p&gt;

&lt;p&gt;Os selects sanguinarios foram gerados pelo hibernate e estao matando o acesso ao banco, tem clausula from com mais de 100 linhas.&lt;/p&gt;

&lt;p&gt;Ainda bem que eu nao uso mais Java e mesmo quando usava testei o hibernate e vi que era iviavel :)&lt;/p&gt;

&lt;p&gt;Isso so me torna cada vez mais entusiasta do ruby e do rails :)&lt;/p&gt;</description>
      <pubDate>Sun, 18 Feb 2007 07:35:00 PST</pubDate>
      <guid>http://carcara.railsplayground.com/articles/2007/02/18/sql-select-de-600-linhas</guid>
      <link>http://carcara.railsplayground.com/articles/2007/02/18/sql-select-de-600-linhas</link>
      <trackback:ping>http://carcara.railsplayground.com/articles/trackback/8</trackback:ping>
    </item>
    <item>
      <title>Ruby + Python</title>
      <description>&lt;p&gt;A cada dia estou mais seguro de ter escolhido o caminho certo. Bem, python  na verdade não foi escolha, foi paixão. E rails quem escolhei foi o meu chefe. :) Mas digamos que eu tenha escolhido essas 2 linguagens.&lt;/p&gt;

&lt;p&gt;Recentemente eu quiz usar no rails uma api escrita em python (que faz parte de um sistema em funionamento na empresa). Achei um projeto chamado rupy com ele aplicações ruby podem usar classes python etc. Pois é, e esse é o nome da conferência internacional sobre python e ruby.&lt;/p&gt;

&lt;p&gt;O evento vai acontecer na Polonia nos dias 14 e 15 de abril numa cidade chamada POZNA. O objetivo do evento é incentivar o uso de python e ruby (não canso de falar e escrever essas palavras) no leste europeu.&lt;/p&gt;

&lt;p&gt;Para maiores informações visitem o site do evento (que é feito em php) http://rupy.wmid.amu.edu.pl&lt;/p&gt;</description>
      <pubDate>Sun, 11 Feb 2007 17:45:00 PST</pubDate>
      <guid>http://carcara.railsplayground.com/articles/2007/02/11/ruby-python</guid>
      <link>http://carcara.railsplayground.com/articles/2007/02/11/ruby-python</link>
      <trackback:ping>http://carcara.railsplayground.com/articles/trackback/7</trackback:ping>
    </item>
    <item>
      <title>Seamonkey</title>
      <description>&lt;p&gt;Pessoal voltei ao mozillão. O Seamonkey, antiga suite mozilla, atualmente está sendo mantido pela comunidade.&lt;/p&gt;

&lt;p&gt;Uma das novidades é que o navegador da suíte de aplicativos seamonkey agora usa a mesma engine que o firefox 2, enquanto o cliente de email usa a mesma do thunderbird 2 que ainda nem foi lançado.&lt;/p&gt;

&lt;p&gt;Como dá para ver a vantagem é que o seamonkey atualmente está andando um pouco a frente do firefox e thunderbird.&lt;/p&gt;

&lt;p&gt;Recentemente ao perceber um bug na renderização de páginas com alguns javascripts no firefox 2, eu corri para o seamonkey para comparar o resultado e não deu outra, no seamonkey tudo funcionou perfeito. Foi quando fui comparar e vi que a versão do Gecko (engine de renderização das páginas) no seamonkey estava aproximadamente 1 mês mais nova que no firefox 2.&lt;/p&gt;

&lt;p&gt;Aí eu pensei: será que após ter abandonado o velho mozilão o pessoal agora ta usando ele (como bucha de canhão) para testar as features para o firefox?&lt;/p&gt;

&lt;p&gt;E parabéns ao pessoal da comunidade Mozilla Brazil, com a qual já tive o prazer de colaborar, por já ter traduzido o seamonkey 1.1 para português do Brasil.&lt;/p&gt;

&lt;p&gt;Vale a pena conferir, o site do Mozilla Brasil é http://www.mozilla.org.br&lt;/p&gt;</description>
      <pubDate>Sun, 11 Feb 2007 17:27:00 PST</pubDate>
      <guid>http://carcara.railsplayground.com/articles/2007/02/11/seamonkey</guid>
      <link>http://carcara.railsplayground.com/articles/2007/02/11/seamonkey</link>
      <trackback:ping>http://carcara.railsplayground.com/articles/trackback/6</trackback:ping>
    </item>
    <item>
      <title>PostgreSQL on Rails</title>
      <description>&lt;p&gt;Não demorou e alguns fanáticos pelo PostgreSQL como eu, começaram a desenvolver plugins específicos para uso com o PostgreSQL.&lt;/p&gt;

&lt;p&gt;É o caso do rails-psql-auth (http://rubyforge.org/projects/rails-psql-auth/) que é um plugin para fazer sua aplicação autenticar os usuarios pelo sistema de autenticação do PostgreSQL.&lt;/p&gt;

&lt;p&gt;Minha intenção não é discutir se isso é bom ou ruim, melhor ou pior, apenas mostrar  esse excelente trabalho como exemplo.&lt;/p&gt;

&lt;p&gt;Outro bom, esse eu gostei e recomendo é o acts_as_tsearch. Para quem não conhece o Tsearch (http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/) é uma extensão para o PostgreSQL que provê o recurso de indexação de textos com recursos fantásticos como ranking dos resultados e um função header que mostra o trecho do conteúdo onde foi satisfeito o critério da busca.&lt;/p&gt;

&lt;p&gt;O site do projeto é http://acts-as-tsearch.rubyforge.org/.&lt;/p&gt;

&lt;p&gt;Para quem já tem o tsearch instalado e funcionando a instalação do plugin é tão simples quanto a de qualquer um outro e o uso se assemelha a outros acts&lt;em&gt;as_alguma&lt;/em&gt;coisa.&lt;/p&gt;

&lt;p&gt;Para quem quer dar agilidade a suas buscas e extrair o maximo em funcionalidades =&gt; (PostgreSQL + Tsearch2 + Rails + acts_as_tsearch)&lt;/p&gt;</description>
      <pubDate>Sat, 10 Feb 2007 17:05:00 PST</pubDate>
      <guid>http://carcara.railsplayground.com/articles/2007/02/10/postgresql-on-rails</guid>
      <link>http://carcara.railsplayground.com/articles/2007/02/10/postgresql-on-rails</link>
      <trackback:ping>http://carcara.railsplayground.com/articles/trackback/5</trackback:ping>
    </item>
    <item>
      <title>Eu trabalho com rails</title>
      <description>Isso mesmo, o site &lt;a href="http://workingwithrails.com/" target="_blank"&gt;http://workingwithrails.com/&lt;/a&gt; cadastra desenvolvedores que trabalham com rails, vendo isso resolvi me cadastrar e criar meu profile: &lt;a href="http://workingwithrails.com/person/7646-nabucodonosor-coutinho-costa" target="_blank"&gt;http://workingwithrails.com/person/7646-nabucodonosor-coutinho-costa&lt;/a&gt;</description>
      <pubDate>Sun, 28 Jan 2007 05:22:00 PST</pubDate>
      <guid>http://carcara.railsplayground.com/articles/2007/01/28/eu-trabalho-com-rails</guid>
      <link>http://carcara.railsplayground.com/articles/2007/01/28/eu-trabalho-com-rails</link>
      <trackback:ping>http://carcara.railsplayground.com/articles/trackback/4</trackback:ping>
    </item>
    <item>
      <title>Freeride on Rails</title>
      <description>&lt;p&gt;Pessoal, brincando de descobrir ides e editores para rails eu achei o freeride, que acredito que todo mundo conhece, o que eu descobri foi que com ele podemos debugar uma aplicacao rails e acompanhar todo o processo dentro do proprio editor (como no rad rails), bastando para isso iniciar o debug no arquivo script/server.&lt;/p&gt;

&lt;p&gt;Vale a pena dar uma conferida no site do projeto em &lt;a href="http://freeride.rubyforge.org/" target="_blank"&gt;http://freeride.rubyforge.org/&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 27 Jan 2007 20:47:00 PST</pubDate>
      <guid>http://carcara.railsplayground.com/articles/2007/01/27/freeride-on-rails</guid>
      <link>http://carcara.railsplayground.com/articles/2007/01/27/freeride-on-rails</link>
      <trackback:ping>http://carcara.railsplayground.com/articles/trackback/3</trackback:ping>
    </item>
    <item>
      <title>HABTM - Has And Belongs to Many</title>
      <description>&lt;p&gt;Pessoal, hoje vamos ver como fazer um formulário master detils para uma relação has_one.&lt;/p&gt;

&lt;p&gt;Sem enrolação. Vamos usar 2 tabelas uma chamada pessoas e uma chamada pessoa_detalhes.&lt;/p&gt;

&lt;p&gt;Primeiro vamos criar um novo projeto chamado &amp;#8230; carcara.&lt;/p&gt;

&lt;pre&gt;
rails carcara
&lt;/pre&gt;

&lt;p&gt;Agora vamos rodar o comando &amp;#8220;script/generate migration create_pessoas&amp;#8221; para gerar nosso migrate.&lt;/p&gt;

&lt;p&gt;O seu migrate deve ficar parecido com o código abaixo, claro que você pode por quantos campos quizer, mas como amanha pela manhão eu vou a praia eu não quero me cansar muito hoje neste artigo. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
class CreatePessoas &lt; ActiveRecord::Migration
  def self.up
    create_table "pessoas" do |t|
      t.column :nome,     :string
      t.column :email,    :string
    end
  end

  def self.down
    drop_table "pessoas"
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora vamos gerar o migrate para a tabela de detalhes com o seguinte comando:&lt;/p&gt;

&lt;p&gt;&amp;#8220;script/generate migration create&lt;em&gt;pessoa&lt;/em&gt;detalhes&amp;#8221;&lt;/p&gt;

&lt;p&gt;O migrate para a tabela de pessoas tambem vai ficar bem simples, eu defini apenas 2 campos e os motivos vocês já sabem.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
class PessoaDetalhes &lt; ActiveRecord::Migration
  def self.up
    create_table "pessoa_detalhes"do |t|
      t.column :pessoa_id, :integer
      t.column :description, :string
    end
  end

  def self.down
    drop_table "pessoa_detalhes"
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Simples né? O campo pessoa_id na tabela de detalhes é que vai manter a relação do detalhe com o registro da pessoa.&lt;/p&gt;

&lt;p&gt;Agora vamos mandar criar essas tabelas em nosso banco de dados com o comando &amp;#8220;rake migrate &amp;#8211;trace&amp;#8221;.&lt;/p&gt;

&lt;p&gt;O &amp;#8211;trace é só para ver mais detlahes do que vai acontecer no processo.&lt;/p&gt;

&lt;p&gt;Se tudo deu certo seu banco de dados tem as 2 tabelas do nosso exemplo e podemos comecar a brincadeira.&lt;/p&gt;

&lt;p&gt;Vamos usar o trestle ou o scaffold generator para iniciar nossa brincadeira. Como a maioria do pessoal deve usar scaffold, vamos de scaffold: script/generate scaffold pessoa.&lt;/p&gt;

&lt;p&gt;Podemos repetir o passo acima para gerar o trestle ou scaffold da tabela pessoa_detalhes tambem.&lt;/p&gt;

&lt;p&gt;Após gerado nosso código base vamos editar os nossos models para definir a relação um para um entre as 2 tabelas.&lt;/p&gt;

&lt;p&gt;O model pessoa deve ficar assim:&lt;/p&gt;

&lt;p&gt;class Pessoa &amp;lt; ActiveRecord::Base
  has_one :PessoaDetalhe # essa linha diz que pessoa tem relacao com um registro em PessoaDetalhe
end&lt;/p&gt;

&lt;p&gt;A linha &lt;/p&gt;

&lt;p&gt;O model pessoa_detalhe deve ficar assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
class PessoaDetalhe &lt; ActiveRecord::Base
  belongs_to :Pessoa # essa linha diz que PessoaDeatlhe tem ligação com Pessoa
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Moleza né? Pra quem disse que não ia ter enrolação nesse artigo eu já enrolei de mais também né não?
oode
Pra quem usou trestle o codigo que vai ser implementado no controller é usado na action new.&lt;/p&gt;

&lt;p&gt;Confira:&lt;/p&gt;

&lt;p&gt;O create original gerado pelo scaffold era esse:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
  def create
    @pessoa = Pessoa.new(params[:pessoa])
    if @pessoa.save 
      flash[:notice] = 'Pessoa was successfully created.'
      redirect_to :action =&gt; 'list'
    else
      render :action =&gt; 'new'
    end
  end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos inserir uma linha e meia e vai ficar assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
  def create
    @pessoa = Pessoa.new(params[:pessoa])
    @pessoa.PessoaDetalhe = PessoaDetalhe.new # Cria o registro dependente PessoaDetalhe
    if @pessoa.save and @pessoa.PessoaDetalhe.save # Salva os 2 registros 
      flash[:notice] = 'Pessoa was successfully created.'
      redirect_to :action =&gt; 'list'
    else
      render :action =&gt; 'new'
    end
  end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para quem usa trestle o próximo codigo vai na action edit.&lt;/p&gt;

&lt;p&gt;Abaixo o código gerado pelo scaffold:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
  def update
    @pessoa = Pessoa.find(params[:id])
    if @pessoa.update_attributes(params[:pessoa])
      flash[:notice] = 'Pessoa was successfully updated.'
      redirect_to :action =&gt; 'show', :id =&gt; @pessoa
    else
      render :action =&gt; 'edit'
    end
  end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora precisamos alterar para que mande atualizar tambem os dados do resgistro filho na tabela pessoa_detalhes. Nossa action action vai ficar assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
  def update
    @pessoa = Pessoa.find(params[:id])
    if @pessoa.update_attributes(params[:pessoa]) and @pessoa.PessoaDetalhe.update_attributes(params[:pessoa_detalhe])
      flash[:notice] = 'Pessoa was successfully updated.'
      redirect_to :action =&gt; 'show', :id =&gt; @pessoa
    else
      render :action =&gt; 'edit'
    end
  end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora que temos nosso create e update pronto para ligar com os 2 registros simultaneamente, vamos para a nossa view ver como vai ficaro nosso form.&lt;/p&gt;

&lt;p&gt;Aqui é que está o segredo. Para começão, vamos editar as tags que geram o nosso form. Elas estão nas views new e edit.&lt;/p&gt;

&lt;p&gt;O segredo é:&lt;/p&gt;

&lt;p&gt;Forms master details, precisam ser definidos com blocos de código form&lt;em&gt;for e fields&lt;/em&gt;for. No nosso caso a grosso modo ficaria algo como:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
&lt;% form_for :pessoa, :bla-bla-bla ...... do |f| %&gt;
   aqui vao os campos do model pessoa:
   &lt;%= f.text_field :nome %&gt;
   ....
   &lt;% fields_for :pessoa_detalhe %&gt;

   &lt;% end -%&gt;

&lt;% end -%&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sendo que no nosso caso temos 4 arquivos separados para mosntar o form final como estah descrito acima, são eles: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
app/views/pessoas
   new.rhtml
   edit.rhtml
   _form.rhtml
app/views/pessoa_detalhes
   _form.rhtml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A tag de geração do form em nosso new.rhtml de pessoas vão ficar assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
&lt;% form_for :pessoa, @pessoa, :url =&gt; {:action =&gt; "create"} do |f| -%&gt;
  &lt;%= render :partial =&gt; 'form', :locals =&gt; { :f =&gt; f } %&gt;
  &lt;%= submit_tag "Create" %&gt;
&lt;% end -%&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A primeira linha  diz que esse form é para o model pessoa e inicio um bloco de código passando o model como parametro para o form, o nome usado para o parametro foi f.&lt;/p&gt;

&lt;p&gt;Na segunda linha eu só alterei para que o nosso partial _form tenha acesso a nossa variavel local f que representa nosso model.&lt;/p&gt;

&lt;p&gt;A terceira linha é o submit que todo mundo já conhece e que não foi alterada.&lt;/p&gt;

&lt;p&gt;E a quarta linha é o fim do bloco de código form_for.&lt;/p&gt;

&lt;p&gt;Nosso partial _form também precisa ser alterado, precisamos fazer com que os fields sejam gerados a prtir do parametro que representa o model.&lt;/p&gt;

&lt;p&gt;Vamos andar de tráz para frente como caranguejo&amp;#8230; hummm&amp;#8230; cagangueijo anda é de lado né?&lt;/p&gt;

&lt;p&gt;Bem, vamos editar o nosso partial de pessoa_detalhe que vai ser usado dentro do form de pessoas.&lt;/p&gt;

&lt;p&gt;vamos deixar ele assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
&lt;% fields_for :pessoa_detalhe, detalhe do |f| %&gt;
    &lt;p&gt;&lt;label for="pessoa_detalhe_description"&gt;Description&lt;/label&gt;&lt;br/&gt;
    &lt;%= f.text_field :description  %&gt;&lt;/p&gt;
&lt;% end %&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nosso _form.rhtml de pessoa vai ficar assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
&lt;%= error_messages_for 'pessoa' %&gt;
&lt;%= error_messages_for 'pessoa_detalhe' %&gt;

&lt;p&gt;&lt;label for="pessoa_nome"&gt;Nome&lt;/label&gt;&lt;br/&gt;
&lt;%= f.text_field :nome  %&gt;&lt;/p&gt;

&lt;p&gt;&lt;label for="pessoa_email"&gt;Email&lt;/label&gt;&lt;br/&gt;
&lt;%= f.text_field :email  %&gt;&lt;/p&gt;

&lt;%= render :partial =&gt; "/pessoa_detalhes/form", :locals =&gt; { :detalhe =&gt; @pessoa.PessoaDetalhe } %&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pronto, com isso nosso new.rhtml faz isso: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
&lt;% form_for :pessoa, @pessoa, :url =&gt; {:action =&gt; "create"} do |f| -%&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nosso _form.rhtml de pessoas faz isso:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
&lt;%= error_messages_for 'pessoa' %&gt;
&lt;%= error_messages_for 'pessoa_detalhe' %&gt;

&lt;p&gt;&lt;label for="pessoa_nome"&gt;Nome&lt;/label&gt;&lt;br/&gt;
&lt;%= f.text_field :nome  %&gt;&lt;/p&gt;

&lt;p&gt;&lt;label for="pessoa_email"&gt;Email&lt;/label&gt;&lt;br/&gt;
&lt;%= f.text_field :email  %&gt;&lt;/p&gt;

E o _form.rhtml de pessoa_detalhes faz:

&lt;% fields_for :pessoa_detalhe, detalhe do |f| %&gt;
    &lt;p&gt;&lt;label for="pessoa_detalhe_description"&gt;Description&lt;/label&gt;&lt;br/&gt;
    &lt;%= f.text_field :description  %&gt;&lt;/p&gt;
&lt;% end %&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E o new.rhtml fecha o form com:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
&lt;% end -%&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bom, já deve funcionar. Como tarefa vou deixar para vocês fazerem fincionar a action edit.&lt;/p&gt;</description>
      <pubDate>Sat, 27 Jan 2007 20:29:00 PST</pubDate>
      <guid>http://carcara.railsplayground.com/articles/2007/01/27/habtm-has-and-belongs-to-many</guid>
      <link>http://carcara.railsplayground.com/articles/2007/01/27/habtm-has-and-belongs-to-many</link>
      <trackback:ping>http://carcara.railsplayground.com/articles/trackback/2</trackback:ping>
    </item>
    <item>
      <title>De cara nova de novo</title>
      <description>&lt;p&gt;Ficando ainda mais radical, troquei o WordPress que eh escrigto em php, pelo Typo que eh escrito em rails. :)
&lt;/p&gt;

&lt;p&gt;
Agora soh tenho que postar de novo alguns textos :)
&lt;/p&gt;</description>
      <pubDate>Sat, 27 Jan 2007 20:18:00 PST</pubDate>
      <guid>http://carcara.railsplayground.com/articles/2007/01/27/de-cara-nova-de-novo</guid>
      <link>http://carcara.railsplayground.com/articles/2007/01/27/de-cara-nova-de-novo</link>
      <trackback:ping>http://carcara.railsplayground.com/articles/trackback/1</trackback:ping>
    </item>
  </channel>
</rss>
