i76 webdesign, Sittard

7 september 2010

Weblog Rubrieken

i76 webdesign, Sittard

Association Extensions in Ruby on Rails

Geschreven door: Tom-Eric

Dit is een vertaling en uitbreiding van mijn orginele artikel, over association extensions in RoR.

Stel je bent een model aan het maken, en je wilt graag je messages koppelen aan je user. Dat is natuurlijk heel makkelijk in Ruby on Rails:

class User < ActiveRecord::Base
  has_many :messages
end

Vervolgens kan je op eenvoudige manier de berichten van een gebruiker benaderen. Alles wat nodig is is het vinden van de user en daarna kan je ze direct aanroepen om er leuke dingen mee te doen. Bijvoorbeeld het weergeven van de hoeveelheid berichten die een gebruiker heeft:

>> user = User.find :first
=> #<User:0xb715586c @attributes={"nickname"=>"tomeric", "id"=>"1", "first_name"=>"Tom-Eric", "last_name"=>"Gerritsen"}>
>> user.messages.length
=> 7

Maar nu heeft een gebruiker ongelezen berichten, en je wilt graag weten hoeveel dat er zijn. Je kan natuurlijk hier naar gaan zoeken:

>> user.messages.find(:conditions => 'unread = 1').length
=> 3

Of je kan een nieuwe relatie aanleggen:

class User < ActiveRecord::Base
  has_many :messages
  has_many :unread_messages, :conditions => 'unread = 1'
end

Zodat je nu met user.unread_messages.length de hoeveelheid ongelezen berichten kan opvragen, maar er is een nettere manier, namelijk met association extensions (documentatie op de Associations documentatie pagina).

Een passend voorbeeld van hoe je code er dan uit zou zien:

class User < ActiveRecord::Base
  has_many :messages do
    def unread(reload = false)
      @unread_messages = nil if reload
      @unread_messages ||= find(:all, :conditions => ‘unread is 1′)
    end
  end
end

Nu kan je de hoeveelheid ongelezen berichten opvragen met behulp van deze association extension; user.messages.unread.length. Het oogt meteen veel netter!

Laat een reactie achter




XHTML: Je mag deze elementen en attributen gebruiken: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>


i76 webdesign, Sittard
Tel 046 4007004
Fax 046 4009640
E-mail