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 ruby, ruby on rails, dagmethode | 2 reacties
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 ruby, dagmethode | geen reacties
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 events | 7 reacties
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 caching, nginx | geen reacties
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 ruby, dagmethode | geen reacties