« Ruby und Rails Dokumentation | Main | Noch viel zu lernen?!? »

The secret santas on rails

Als erstes - zugegebenerweise recht kleines - Rails Projekt bin ich grade dabei die Secret Santa Anwendung mit Rails umzusetzen. Hauptsächlich um mal zu lernen, wie der ganze Krempel in Rails so zusammenhängt und um erste Erfahrungen an einem simplen Beispiel zu sammeln.

Und ich muss zugeben, da war ich bis jetzt schon gut beschäftigt. Eigentlich ist das ja eine kleine Anwendung, aber irgendwie hab ich schon für's Grundgerüst rel. lange gebraucht (wesentlich länger als für die reine Ruby Anwendung).

Meine Hauptprobleme waren erstmal weiter mit der Syntax klar zukommen (wann nehme ich person.id, wann :id zur Übergabe von Parametern etc. - ich weiss nicht, ob ich das schon 100%ig gerafft habe), wie ich richtig auf Zeilen oder Felder in meiner Datenbank zugreife (Stichwort .find) und wie er einen Datenbankabfrage aller Datensätze in einen Array packt (nämlich als Hash - also hat man einen Hash in einem Array - im Nachhinein schon logisch, aber man muss sich erstmal dran gewöhnen) und wie ich dann auf diesen zugreife.

Naja, die signifikanten Codeauschnitte sehen dann so aus:

Die Klasse einer Person:

class Person < ActiveRecord::Base  
  has_one :person

  #do you have a correct santa assigned?
  def has_correct_santa?
    lastname != Person.find(person_id).lastname
  end

  #can one person be the santa of other?
  def can_be_santa_of?(other)
    lastname != other.lastname
  end

  #return the object behind the person_id
  def personal_santa
    Person.find(person_id)
  end
end

Die Methode swap_santas:

#switches the two personal_santas of the passed people
  def swap_santas (person1, person2)
    person1.update_attribute("person_id", person2.person_id)
    person2.update_attribute("person_id", person1.person_id)
  end

Die Methode assign_santas:

#assigns each person his secret santa
  def assign_santas
    @people = Array.new
    @people = Person.find(:all)
    @santas = Array.new(@people)
    @people.each { |person| 
            person.person_id = 
@santas.delete_at(rand(@santas.length)).id #assigns santas randomly
            person.update_attribute("person_id", person.person_id)
          }

    @people.each { |person| 
      unless person.has_correct_santa?
        candidates = @people.select { |p| 
p.personal_santa.can_be_santa_of?(person)
 && person.personal_santa.can_be_santa_of?(p) } #finds possible candidates for a swap
        swap_santas(person, candidates[rand(candidates.length)])
      end
      }
    flash[:notice] = 'The secret santas have been assigned!'
    redirect_to :action => 'list'
  end

So funktioniert es im Moment auf jeden Fall, aber das ist keine gute Lösung. In dieser Version habe ich definitiv mehr Datenbankzugriffe als nötig sind. Ich sollte besser nur einmal die Daten aus der Datenbank holen und dann mit diesen Werten arbeiten bis die Partner korrekt zugewiesen sind und dann den Kram in die Datenbank zurückschreiben (so werden die Daten 2x geschrieben: einmal beim zufälligen zuweisen und dann nochmal bei der ggf. notwendigen Korrektur). Oder nicht?

Naja, ich denke das werde ich noch verbessern und mir dann auch mal angucken, wie das mit Stylesheets und Javascript in Rails gemacht wird.

About

DanielHi. I'm Daniel Pietzsch and this is my innoQ-Blog. I'm a 26y old student at FH Bochum and working student at innoQ.
In this blog I mainly write about the progress concerning my diploma thesis which will be an in-house application for innoQ based on Ruby on Rails, but some other (geek) stuff might appear here, too.

daniel [dot] pietzsch [alt-L] innoq [dot] com

I recommend

Categories

Recent Comments

License

Creative Commons License This weblog is licensed under a Creative Commons License.
Powered by
Movable Type 3.31