Edge Rails: opcional :select no has_one e belongs_to

30 de maio de 2008  |  Rails 2.1  | 

Os famosos has_one e belongs_to acabam de receber mais uma opção, o já conhecido :select.

Por padrão esta opção é o “*” do SELECT * FROM, mas você pode mudar isto e recuperar somente as colunas que serão usadas, ou sei lá… use sua imaginação.

Só um detalhe, não esqueça de colocar a primary e as foreign keys, senão você terá um lindo erro.

Outra alteração é que a opção :order do belongs_to foi removida. Eu nem sabia que ela existia… aliás ela nem servia para nada mesmo.



3 Comentários


  1. Hahahaha!
    Sem querer ser chato, esse foi meu também! =)

    Mas foi o último (por enquanto)! ;)

    Esse é de especial importância, porque o Pagestacker guarda o conteúdo das páginas crawleadas no banco de dados e trazer esse conteúdo quando só queremos a url, adiciona uma carga desnecessária.

    O que vale citar, é que o :select só funciona com queries “simples”, porque usa a feature de preload associations do Rails 2 (as associações são carregadas em queries separadas). Por exemplo:

    class Bookmark ‘id, url’
    end

    Bookmark.all(:include => :page)

    O último comando busca primeiro todos os bookmarks e depois faz outra query para buscar as “pages” dos bookmarks (no seu log que terá duas queries).

    Se você fizer algo como:

    Bookmark.all(:include => :page, :conditions => ‘pages.indexed_at IS NOT NULL’)

    O Rails vai trazer tudo em uma query só, já que nesse caso ele faz referência entre as tabelas e portanto o :select não funciona, porque o Rails o sobrescreve (comportamento igual ao Rails 1.x).

  2. No código acima, leiam:

    class Bookmark < ActiveRecord::Base
    belongs_to :page, :select => ‘id,url’
    end

    E Carlos, para não me estender muito aqui, eu continuei o meu raciocínio no meu blog:

    http://josevalim.blogspot.com/2008/05/rails-e-patches.html

    ;)

Deixe um comentário