Web,ruby, Ajax ou qualquer outra coisa que me venha a cabeça (com prioridade para esta última)

23 fevereiro, 2006

has_one

A associação has_many permite-nos fazer uma correspondência entre um registo numa tabela e um registo noutra tabela.

Exemplos disto:

  • Num sistema de forum uma entrada tem um autor.
  • Num sistema de registo (login), cada utilizador tem um perfil.

Exemplo: Forum

Ver o exemplo do forum.

has_many

A associação has_many dá um modo de aceder a uma relação unidirecional entre duas tabelas.

Exemplos disto:

  • As bases de dados das companhias onde uma companhia possui (has) várias contas.
  • Num sistema de foruns, onde uma categoria possui vários forum, e estes possuem vários tópicos

Exemplo: Forum

Ver o exemplo do forum

Ver também

belongs_to

belongs_to complementa uma associação has_many ou uma associação has_one.

Em geral, o modelo Coisa belongs_to :barra se a tabela coisa tiver uma coluna chave externa barra_id.

Exemplos disto:

  • As bases de dados das companhias onde uma conta pertence (belongs) a uma companhia.
  • Num sistema de foruns, onde um topico pertence a um forum, que pertence a uma categoria

Exemplo: Forum

Ver o exemplo do forum

Notas

Quando usar :counter_cache => true, assegure-se que o valor por omissão da coluna model_count é algo que possa ser incrementado. Por exemplo NULL + 1 é igual a NULL e assim o contador SQL não funcionará.

Ver a API para mais informação sobre :counter_cache

22 fevereiro, 2006

Mashupfeed

Se me perguntassem para que serviam os mashup não saberia o que responder (santa ignorância a minha) pois é uma pessoa está demasiado tempo a olhar para a esquerda que não vê o que é que se passa à direita. Depois uma pessoa começa a brinca com googlemaps e fica-se altamente perturbado.

Para verem o que é que quero dizer imaginem que querem fazer winsurf cá o que é que fariam se não conhecem ninguém. Talvez passar pelo mapa do vento, um dos exemplos de mashup listados no mashupfeed.


Cada vez gosto mais dos microformatos

Com toda a excitação que ocorre com o AJAX não tinha olhado para outros métodos de obter páginas com interactividade elevada com métodos mais simples.

No entanto tenho estado a experimentar isto com um pouco mais de atenção e claro que encontrei muita coisa de que ainda não tinha ouvido falar anteriormente como por exemplo em: AHAH (tive em tempos um jogo que se chamava assim) e em JAH algo que é uma união de AHAH com JSON.

15 fevereiro, 2006

yuiBLOG

Yahoo! User Interface Blog

Algo interessante e a ver por quem quer usar as bibliotecas criadas e públicas do Yahoo!

Biblioteca UI do Yahoo!

Além da biblioteca de Padrões de concepção o yahoo também disponibiliza uma biblioteca Ajax/DHTML, será que devia dizer Ajax/DOM de boa qyalidade com capacidade de arrastar/largar, gestão de eventos, manipulação de posicionamento, etc.

Yahoo! Developer Network

O Yahoo apresenta actualmente no seu portofolio serviços para programadores (no sentido em que sejam responsáveis pelo desenvolvimento de um sítio) uma biblioteca de padrões de concepção muito interessante.

12 fevereiro, 2006

O blogue do João Craveiro

O João Craveiro há relativamente pouco tempo fez uma revisão do aspecto gráfico do seu blogue o lâmpada azul agora fez mais do que isso reinventou-o dando-lhe uma finalidade mais abrangente, passou de blogue de aficionado da informática para aficionado pela vida (introduzindo secções novas como artes e letras, críticas de filmes e outras coisas que têm a haver com estilo de vida). Parabéns pela alteração.

07 fevereiro, 2006

Newvine

Hoje li o meu convite para o beta do newsvine

04 fevereiro, 2006

Elementos e marcadores opcionais

opcionais />

HTML, os marcadores de iníco e fim dos elementos e são opcionais. Assim o código que se segue é um documento perfeitamente válido e conforme o HTML 4.01 Strict. /> /> HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd" /> documento mais pequeno possl /> http-equiv="Content-Type"
content="text/html; charset=UTF-8" /> Mais Pequeno /> />Isto é um documento dos mais pequenos possíveis em
title="HyperText Markup Language" /> /> />
os marcadores sejam opcionais os elementos não o são Lembre-se que um elemento é parte da estrutura do documento e que os marcadores são as declarações para criar a estrutura do documento. Onde se pode determinar sem ambiguidade o marcador inicial e final o HTML permite que estes marcadores sejam opcionais mas os elementos irão surgir na estrutura do documento. No exemplo acima coloquei um marcador final. No HTML tal é opcional pois pode ser determinado sem ambiguidade o final do parágrafo. /> validar um documento com o conteúdo acima no W3C validator. /> XHTML, os marcadores de início e fim dos elementos html, head, e body são obrigatórios devido à exigência de boa constituição do XML que não permite a omissão de marcadores. /> interpretação de documentos pode ser afectada pelo tipo MIME usado quando são servidos, sendo a interpretação ainda dependente do navegador usado. />

03 fevereiro, 2006

Inspector de Tabelas Complexas

Gus Lemon publicou no Juicy Studio um artigo onde revela como melhorar a acessibilidade de tabelas complexas de dados.

Como tratar um Web Designer

Fergus Webber diz como tratar um Web deisgner (sic) muito bem. Não vale a pena repetir aqui.

Comprimento, Largura e Altura

Parece que temos que voltar à geometria e estudar o que é que significam os eixos X Y e Z (profundidade). Para saber porquê então veja o artigo:

Z's not dead baby, Z's not dead

AT MEDIA 2006

Este ano em Londres irá suceder uma conferência de dois dias sobre desenvolvimento web na @media2006. Vai haver um conjunto de conferencistas de primeiro plano: Andy Budd, Dan Cederholm (do Bullefproof Web Design e Web Standards Solutions), Tantek Çelik (CT da Technorati), Peter-Paul Kock (o homem por trás do QuiksMode), Eric Meyer (O CSS em pessoa), Cameron Moll, Roger Johansson e alguns outros.

Dilbert

Vejam o Dilbert de 29 de Janeiro.

O mundo deve ser perfeito!

Andulo - Moinhos de água do Membia


Andulo - Moinhos de agua 2, originally uploaded by Carlos João.

Esta é uma irmã entre várias de uns moinhos construidos sobre o rio Membia, perto da ântiga barragem do Andulo no Bié em Angola.

This is one of a set of photos of watermills built on the river Membia nearby the old waterdam of Andulo, Bié, Angola.

31 janeiro, 2006

ALA - 210 e 211

ALA 210

O triplo objectivo da acessibilidade: obter abreviaturas correctas é quanto a mim o artigo mais interessante deste número, desta vez não acompanho o Jeffrey na sua ironia sobre a Web 3.0. Compreendo contudo que em todos as reuniões aparecem uns mais cromos que outros.

ALA 211

Aperfeiçoar os fundamentos: Um melhor layout CSS de três colunas. Entradas que fazem mais e finalmente um texto de Jeffrey Zeldman (Repescado) Corrija o seu sítio com o DOCTYPE correcto!.

24 janeiro, 2006

RoR: Como Paginar

Paginação Simples

Usar o ajudante de paginação

Paginação à medida

O método de paginação embutido no RoR torna-se limitado quando as suas necessidades se tornam mais complexas. É então necessário usar uma técnica melhor:

O método do Kevin de paginação à medida implica usar quatro passos.

No controlador:


def list
  #passo 1: ler e atribuir valores às variáveis que necessitamos
  page = (params[:page] ||=1).to_i
  items_per_page = 20
  offset = (page -1) * items_per_page

  #passo 2: efectuar o seu find à medida efectuando 
  #qualquer tipo de limites ou deslocamentos
  # isto é obter tudo em cada página, não se 
  #preocupar com paginação por agora
  @items = Item.find_com_algum_metodo_a_medida(@alguma_variavel)

  #passo 3: criar um Paginator, a segunda variável
  #tem que ser o número da TOTALIDADE dos items em TODAS as páginas
  @item_pages = Paginator.new(self, @items.length, items_per_page, page)

  #passo 4: só enviar um subconjunto de @items para a vista
  # é aqui que ocorre a magia. Não é necessário voltar a
  # fazer outra busca  (find)
  @items = @items[offset..(offset + items_per_page - 1)]

end

Na vista colocar:


Pages: 
<%= link_to('previous', {:params => params.merge('page' => 
@ item_pages.current.previous)}) +
 ' ' if @ item_pages.current.previous %>

<% for page in @ item_pages -%>
<%= link_to_unless(params[:page].to_i == page.number, page.number,
 {:params => params.merge('page' => page)}) %> 
<% end -%>

<%= link_to('next', {:params => params.merge('page' => 
@item_pages.current.next)}) if @ item_pages.current.next %>

Esta técnica funciona com conjuntos de dados pequenos e médios (onde não tem que se preocupar com um grande número de registos, embora não os queira ver surgir de uma só vez), mas torna-se limitada quando os registos são em elevado número.

Para grandes conjuntos de dados que necessitem de buscas à medida, necessita de saber o número total de registo, depois criar um Paginador e depois só recuperar os registos desejados.

No controlador:


def list
    # passos 1: ler e atribuir variáveis necessárias
    page = (params[:page] ||= 1).to_i
    items_per_page = 20
    offset = (page - 1) * items_per_page

    # passo 2: em vez de efectuar uma busca completa descobrir
    # só o número de registo
    @item_count = Item.find_record_count(@some_variable)

    # passo 3: criar um Paginator, a segunda variável tem 
    #que ser o número de TODOS os items em TODAS as páginas
    @item_pages = Paginator.new(self, @item_count, items_per_page, page)

    # passo 4: descobrir só o subconjunto pedido de @items
    @items = 
    Item. busca_com_algum_metodo_a_medida(@some_variable, 
                                          offset,
                                          items_per_page)

end

Depois necessitará de alterar o método "busca_com_algum_metodo_a_medida" de forma a usar as variáveis offset e items_per_page numa cláusula SQL LIMIT. Se o que descobrir for já complexo, poderá ser mais fácil usar "find_by_sql" em vez de "find".

O código da sua vista pode ser igual ao anterior.

22 janeiro, 2006

Membia

Algo totalmente fora de tópico
Algumas fotografias de moinhos de água que se encontram em: fotografias do João