Onze dagmethode #6: AR.find(..).each

Geplaatst door Remco van 't Veer di, 12 feb 2008 08:00:00 GMT

AR.find(..).each

Wat me vaak dwars zit als ik met ActiveRecord in de weer ben is dat ik na een find-all ook nog eens each moet schrijven. Sterker nog als ik each vergeet en er een block aanplak gebeurd daar helemaal niets mee, ook geen foutmelding of iets dergelijks.

Vandaag dus geen methode maar een methode minder!


class ActiveRecord::Base
  def self.find_with_block_sensitivity(*args)
    r = find_without_block_sensitivity(*args)
    [r].flatten.each {|v| yield v} if block_given?
    r
  end

  class << self
    alias_method :find_without_block_sensitivity, :find
    alias_method :find, :find_with_block_sensitivity
  end
end

Hiermee kunnen we ipv:


Article.find(:all).each {|article| puts article.title}

het volgende schrijven:


Article.find(:all) {|article| puts article.title}

Kijk mij! Zonder each! Werkt voor zowel enkele als meervoudige resultaten.

Geplaatst in , ,  | 2 reacties

Onze dagmethode #5: Enumerable#inject!

Geplaatst door Michiel de Mare ma, 11 feb 2008 06:40:00 GMT

Enumerable#inject is een geweldige en veelzijdige methode – zo veelzijdig dat ik hem regelmatig misbruik:

Neem bijvoorbeeld dit fragment:


ar_of_ar.inject(Hash.new(0)) do |h,a|
  a.each {|x| h[x] += 1 }
  h
end

# ik kon ook een lokale variabele gebruiken:
h = Hash.new(0)
ar_of_ar.each do |h,a|
  a.each {|x| h[x] += 1 }
end

# in ruby 1.9 heb je Object#tap
Hash.new(0).tap do |h|
  ar_of_ar.each do |a|
    a.each {|x| h[x] += 1 }
  end
end

Toch vind ik mijn inject-oplossing het mooist – geen lokale variabelen en ook geen overbodig block. Laten we inject aanpassen met een versie die niet steeds de return-value van het block teruggeeft, maar een die het argument in inject steeds aanpast. Als naam stel ik voor: inject!


module Enumerable
  def inject!(memo)
    each {|x| yield(memo,x) }
    memo
  end
end

ar_of_ar.inject!(Hash.new(0)){|h,a| a.each{|x| h[x] += 1}}

Geplaatst in ,  | geen reacties

Euruko 2008 in Praag

Geplaatst door Michiel de Mare za, 09 feb 2008 00:07:00 GMT

Een Europese Rubyconf in een van de mooiste steden van Europa? Die mag je toch niet missen!

za 29 en zo 30 maart, de registratie is geopend!

www.euruko2008.org

Geplaatst in  | 7 reacties

RESTful page caching met Nginx

Geplaatst door Matthijs Langenberg vr, 08 feb 2008 16:17:00 GMT

Op onze interne testomgeving bij Newminds maken we gebruik van Nginx als frontend webserver. Elke binnenkomende request wordt door Nginx doorgestuurd naar een mongrel proces. Onlangs heb ik rails page caching ingeschakeld en in dit artikel wil ik mijn ervaringen graag met je delen.

In dit artikel zal ik beschrijven wat er in het ‘server’ blok van de nginx configuratie gezet moet worden om statische files (die door rails worden gegenereerd) direct vanaf het bestandsysteem te versturen. Hierbij ga ik er vanuit dat je bekend bent met de configuratie files die nginx gebruikt, als je hier niet bekend mee bent zou je Ezra Zygmuntowicz’s voorbeeld Nginx configuratie kunnen bekijken.

Lees verder...

Tags ,  | geen reacties

Onze dagmethode #4: Hash#excluding en Hash#only

Geplaatst door Remco van 't Veer vr, 08 feb 2008 08:00:00 GMT

Dit ziet er vast bekend uit:


u = params[:user]
attr = if u[:password].blank?
  u.reject do |k,_| 
    [:password, :password_confirmation].include?(k)
  end
end
User.update_attributes(attr || u)

Maar ruikt naar een herbruikbaar truukje, want willen we niet gewoon het volgende schrijven:


u = params[:user]
attr = if u[:password].blank?
  u.excluding(:password, :password_confirmation)
end
User.update_attributes(attr || u)

Simpel te implementeren, inclusief z’n only broertje, met:


class Hash
  def excluding(*keys)
    reject{|k,_| keys.include?(k)}
  end

  def only(*keys)
    reject{|k,_| !keys.include?(k)}
  end
end

Disclaimer: het bovenstaande voorbeeld werkt niet in Rails omdat params een “hash with indifferent access” is. Het maken van een onverschillige variant laat ik aan jou over! :)

Geplaatst in ,  | geen reacties

Oudere artikelen: 1 ... 5 6 7 8 9 ... 20