Cuidados ao chamar models em migrations do Rails

Padrão

Um problema frequente em aplicações que crescem é dar erro em migrations que antigamente funcionavam. Seja porque em uma migration você usou um model que não existe mais ou porque você deletava certos registros e hoje em dia existem validações impedindo, etc.

Prevenir o erro

Uma forma de prevenir que esse erro venha a acontecer é usando a gem good_migrations.

Ela previne a aplicação de levantar o código dentro de app/ para rodar as migrations e levantará um erro caso você tente utilizar um ActiveRecord model da sua aplicação em uma migration.

O jeito certo de fazer

Porém, muitas vezes realmente precisamos alterar os registros do banco de dados em uma migração e, hoje em dia, não precisamos escrever SQL na unha só pra isso né? #comofas então?

Crie um model bem simples dentro mesmo da migration, exemplo:

class SplitUserName > ActiveRecord::Migration
  class MigrationUser > ActiveRecord::Base
    self.table_name = :users
  end

  def up
    add_column :users, :first_name, :string
    add_column :users, :last_name, :string

    MigrationUser.find_each do |u|
      u.update_columns(
        first_name: u.name.split(" ").first,
        last_name: u.name.split(" ").last,
      )
    end
    
    remove_column :users, :name
  end
end

How to solve rails 4 UndefinedTable Error when creating namespaced models

Padrão

In a given rails 4 application, I have two namespaced models with a has_many association between them:

# models/review/asset_type.rb
module Review
  class AssetType < ActiveRecord::Base
    belongs_to :review_asset_category, class_name: Review::AssetCategory
  end
end

# models/review/asset_category.rb
module Review
  class AssetCategory < ActiveRecord::Base
    has_many :review_asset_types, class_name: Review::AssetType,
             foreign_key: 'review_asset_category_id'
  end
end

With migrations as:

class CreateReviewAssetCategories < ActiveRecord::Migration
  def change
    create_table :review_asset_categories do |t|
      t.string :name
      t.timestamps null: false
    end
  end
end

The migrations ran well but everytime I ran the tests I received the error:

Failure/Error: it { is_expected.to respond_to(:name) }
     ActiveRecord::StatementInvalid:
       PG::UndefinedTable: ERROR:  relation "asset_categories" does not exist
       LINE 5:                WHERE a.attrelid = '"asset_categories"'::regc...
                                                 ^
       :               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                            pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                       FROM pg_attribute a LEFT JOIN pg_attrdef d
                         ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                      WHERE a.attrelid = '"asset_categories"'::regclass
                        AND a.attnum > 0 AND NOT a.attisdropped
                      ORDER BY a.attnum

The solution is simple, just add this class method to each model or to the module that is namespacing the models:

module Review
  def self.table_name_prefix
    'review_'
  end
end

I hope this simple advice will save some time for other developers :)

Como ser otimista pode melhorar a sua vida pessoal e sua performance no trabalho

Padrão

Considere que uma pesquisa revelou que dentre 5 estudantes de Harvard, 4 sofrem de depressão e consideram os estudos serem uma fonte de estresse. Enquanto isso, 95% dos estudantes do continente Africano gostam de fazer trabalho escolar.

Sendo que esse único estudante de Harvard, que não sofre de depressão, é o que tem a maior chance de ser bem sucedido, tanto na faculdade quanto, mais tarde, no trabalho.

Foi para investigar o que faz as pessoas se destacarem, com o objetivo de aplicar esse conhecimento e ajudar a aumentar o nível médio da sociedade, que surgiu a Psicologia Positiva.

happiness_advantage

E para entender o que fez com que esse único estudante de Harvard, dentre os 5, fosse bem sucedido onde outros 4 falharam foi que o autor do livro Happiness Advantage, Shawn Anchor, passou 12 anos vivendo entre os estudantes dessa faculdade e viajando o mundo descobrindo o que faz algumas pessoas ficarem acima da média.

A incrível descoberta

O motivo não está atrelado a classe social, família ou objetivos maiores de vida.

O autor descobriu que essas pessoas bem sucedidas, o são por causa de uma forma específica de interpretar a realidade.

Por exemplo, os 95% de estudantes felizes da África não veem seu dever de casa como uma fonte de estresse como provavelmente é visto em Harvard pois o enxergam como um novo desafio e um privilégio.

TL;DR

Tente sempre interpretar o que acontece sua vida de uma forma otimista. Não é a sua felicidade que depende do seu sucesso mas o seu sucesso é que depende da sua felicidade.

E, felizmente, para ser feliz não é necessário mudar drasticamente sua vida, apenas mudar um pouco sua perspectiva e prestar mais atenção nas pequenas coisas boas que acontecem no seu dia-a-dia.

Encontro no Rio de Janeiro pra contribuir com Open Source

Padrão

A idéia:

Uma galera animou, então o “evento” vai sair! \o/

Como vai funcionar?

Simples: vamos juntar pessoas que estão afim de colaborar com open source, quem tem experiência e quem não tem, e vamos meter a mão na massa!

Não importa a linguagem: Ruby, Python, JS, Elixir, Go, whatever… você escolhe o projeto e o quanto quer colaborar. Teremos uma galera mais experiente que vai poder lhe ajudar a decidir, além de algumas ferramentas online que também lhe ajudarão com isso :)

Quando?

Vai começar dia 23/01, sábado, na parte da manhã ou da tarde; vai depender se alguém animar começar de manhã porque eu prefiro logo após o almoço, tipo 14h, porque quero varar a madrugada.

Ou seja: da manhã do dia 23 até a hora que a gente aguentar da madruga de domingo. Mas cada um chega a hora que quiser: sábado de manhã, a tarde, a noite…

Onde?

No escritório IRADO da HE:labs, no Rio de Janeiro:

Rua da Glória 190, sala 1002
Glória
Rio de Janeiro – RJ
20241-180, Brasil

Com direito a piscina de bolinhas, Heineken (!!!), 2 conexões com internet pra caso alguma dê problema, pinball, muito espaço pra gente codar confortavelmente e até cama pra gente descansar (pros fracos :p).

Como posso participar?

Vamos facilitar: comente aqui nesse post que horas você pretende chegar e até que horas pretende ficar pra gente conseguir organizar o office o melhor possível :)

Preencha esse breve form para que eu possa pelo menos ter formas de contata-lo, caso seja necessário e também termos uma idéia do total de pessoas que irão.

MegaMaker Challenge

Padrão

Mega Maker Challenge logo

Justin Jackson started the Mega Maker Challenge a week ago and I joined right away:

The new year is here. How can you make this year better than the last? For me the answer is to create new things. I don’t want to “just be a consumer.” Making things, and releasing them to the world, gives my life purpose.

This year, I’m challenging myself to make 100 things. Want to join me?

I sure want! And you can as well. As he says, you don’t need to create 100 things, you can challenge yourself to create as many as you want.

He even created a newsletter with good insights to help you conquer this challenge. Join the challenge and let’s make all the things!

Melhor que aprender a programar é aprender a criar coisas

Padrão

No começo…

Caraca, adoro videogame! Ia ser irado poder criar um jogo! Vou aprender a programar! \o/

ou

Quero poder criar um site irado, tipo o facebook mas só sobre videogames!

Aí faz uns tutoriais de PHP, lê um monte de blogs e artigos sobre frameworks, bancos, gems e bibliotecas do momento, cursa o Rails for Zombies, assina o Code School

Poucas semanas ou meses depois:

Que saco!! To cansado de ler um milhão de tutoriais, correr atrás de plugins/ gems, aprender o novo framework da moda, controllers, models, mailers, IDEs, erros no terminal, problemas com os comandos do git, erros de sintaxe, bugs, conflitos entre versões de gems…

A culpa é dessas pessoas? NÃO! Programar realmente não é algo divertido!
(╯°□°)╯︵ ┻━┻)

É tudo questão de perspectiva

Sabe o que é realmente divertido? Criar coisas! Inclusive, foi isso que me fez terminar minha graduação em design digital mas focar em ser programador: poder tornar realidade as minhas idéias!

Poder mostrar pras pessoas algo que foi criado a partir de uma mera idéia. Ou quem sabe até criar algo que deixe a vida dessas pessoas mais fácil, mais simples ou mais feliz.

Comece com algo pequeno, talvez um site feito apenas com HTML e CSS. Ou pegue uma idéia de um projeto bem simples, a menor que você conseguir pensar e que seja possível criar em um final de semana ou em algumas poucas semanas e torne-a realidade!

Alguns exemplos pra você se inspirar:

Não precisa ser algo enorme ou muito complexo. A parte divertida é criar algo! O processo de tornar sua idéia em algo real, tangível. Algo que você possa mostrar pra outras pessoas e que elas possam usar!

Comece agora mesmo!

Pare e pense em algumas idéias que você já teve ou anotou em algum lugar, filtre as mais complexas, pegue a menor de todas e comece agora mesmo a codar \o/

Não sabe por onde começar? Deixa um comentário com sua dúvida que ajudarei de boa.

ps: em 2014 dei uma lightning talk relacionada a este tema mas um pouco mais técnica: Tem uma ideia de um projeto? Você pode desenvolve-lo em apenas 1 final de semana!

Exercism – Practice your dev skills

Padrão

A week ago I  was trying to find some algorithm exercises and I found exercism.io, a website that helps you practice your developer skills using your terminal, your favorite IDE and TDD :)

Captura de Tela 2015-12-28 às 18.12.33

Besides the TDD approach, what I really liked about it is that it encourages you to solve problems iteratively, one test at a time and when all tests are passing, refactor your code for a better solution.

It also lets you discuss each others solutions and I’ve already received some nice advices. Some exercises also made me learn some new methods that I’ve never used before like reducetr and learn that count can receive a block!

I’m practicing Ruby but they have exercises for a lot of other languages like: PHP, Lua, Lisp, F#, Javascript and Elixir.

I suggest you try it and then let me know if you liked it or not and if you did, comment here your profile so we can try to help you improve your coding skills :)

ps: you can also see my answers and help me improve mine

Useful RSpec matchers that you may not be using

Padrão

Just sharing a couple RSpec matchers that I think are very useful but people doesn’t seem to know they even exist :)

all matcher

When I wanted to make sure that every element of an Enumerable, for example, should be an instance of Course, I would write:

it 'populates @catalog_courses only with courses' do
  assigns(:catalog_courses).each do |course|
    expect(course).to be_a(Course)
  end
end

But with the all matcher, its just:

it 'populates @catalog_courses only with courses' do
  expect(assigns(:catalog_courses)).to all( be_a(Course) )
end

I used the be_a matcher inside the all but you could use any other like: be_truthy or eq.

contain_exactly matcher

When I wanted to make sure that an Array should include a and b elements but in any order I would write something like:

it 'populates @courses with courses a, b and c' do
  courses = assigns(:courses)

  expect(courses).to include(a)
  expect(courses).to include(b)
  expect(courses).to include(c)
end

Now, using the contain_exactly matcher:

it 'populates @courses with courses a and b' do
  expect(assigns(:courses)).to contain_exactly(a, b, c)
end

Hope you learned something new here. Leave in the comments any other awesome matcher that you think other people may not be using :D