i76 webdesign, Sittard
Association Extensions in Ruby on Rails
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!