Ao realizar buscas no banco de dados, por vezes temos de fazer uso da opção :joins afim de melhorar a performance de nosso aplicativo, em outros casos precisamos simplesmente recuperar algum tipo de informação que depende do resultado de duas tabelas.
Por exemplo, se desejássemos recuperar todos os usuários do sistema que compraram itens da cor vermelha, faríamos algo assim:
User.all :joins => :items, :conditions => ["items.color = ?", 'red']
Este tipo de sintaxe parece incomodar já que você precisa incluir o nome da tabela (no caso items) dentro de uma string. O código parece estranho.
No Edge Rails já se encontra uma novidade nesta questão, nos permitindo fazer a mesma coisa de uma forma um pouco diferente, usando uma chave dentro do hash para identificar a tabela:
User.all :joins => :items, :conditions => { :age => 10,
:items => {:color => 'red' }
}
# um outro exemplo que talvez deixe o código mais claro
User.all :joins => :items, :conditions => { :users => {:age => 10 },
:items => {:color => 'red' }
}
Na minha opinião desta forma o código fica muito mais claro, principalmente se temos de condicionar muitos campos de várias tabelas diferentes.
Só tenha em mente que a chave usada é o nome da tabela (você percebe pelo nome pluralizado) ou um alias caso você o tenha especificado na query.
1 Comentário em "Edge Rails: Uma nova forma de especificar conditions usando Hash"
Opa Carlos, legal isso.
Mas nesse caso eu estou assumindo AND para todas as conditions, se eu quiser especificar um OR, ou um … AND ( … OR … )?
Poderia me tirar uma dúvida em relação ao conditions na forma antiga?
Eu utilizo prefix nas minhas tabelas, pois no servidor antigo eu tinha poucas contas mysql, e como tem vários sistemas de clientes diferentes eu precisava usar o mesmo banco e para não chocar nome de tabelas eu uso prefix setado no environment.rb
ex: config.active_record.table_name_prefix = “cliente_”
Ai quando eu vou utilizar o include e conditions, eu preciso informar antes do atributo o nome da tabela completo (com prefix), com isso temino fazendo assim.
Venda.find :all, :include => [:ticket],
:conditions => [ "#{ActiveRecord::Base.table_name_prefix}tickets.color = :color", {:color => 'blue'} ]
Não teria com o rails incluir esse prefix automaticamente, assim como eu faço Venda.find :all (sem :join ou :include, :conditions) ? Pois o código fica feio d+.
Pior é quando eu preciso usar o :select.
Deixe o seu comentário!