2010-02-09 8 views
3

Je n'ai jamais fait de codage ruby ​​simple - seulement travaillé avec le framework Rails.Décrire les relations de classe dans ruby ​​

Je ne suis pas sûr de savoir comment décrire les relations entre Classes, autres que les relations d'héritage. Par exemple, un objet School peut contenir plusieurs objets Student. Par exemple, un objet School peut contenir plusieurs objets Student. Je voudrais être en mesure de faire des appels comme « myschool.student [2] .first_name » et « mystudent.school.address »

Il est peut-être que je suis confus OOP avec des éléments de databasing relationnel, désolé si Je suis loin.

Répondre

9

Je ne suis pas 100% sûr de ce que la question est ici ...

Pour le premier exemple, myschool.students[2].first_name, votre classe School a besoin d'un accesseur pour un students champ, qui doit être un tableau (ou quelque chose d'autre qui prend en charge les indices) par exemple.

class School 
    attr_reader :students 

    def initialize() 
    @students = [] 
    end 
end 

Le ci-dessus permet myschool.students[2] de retourner quelque chose. En supposant que students contient les instances d'une classe Student, cette classe pourrait être quelque chose comme ceci:

class Student 
    attr_reader :first_name, :last_name 

    def initialize(first, last) 
    @first_name = first 
    @last_name = last 
    end 
end 

Maintenant votre exemple, myschool.students[2].first_name, devrait fonctionner.

Pour le deuxième exemple, mystudent.school.address, vous devez avoir un champ school dans la classe Student et un champ address dans la classe School. Le bit délicat est que les instances School et Student pointent l'une vers l'autre, vous devez donc configurer ces références à un moment donné. Ce serait un moyen simple:

class School 
    def add_student(student) 
    @students << student 
    student.school = self 
    end 
end 

class Student 
    attr_accessor :school 
end 

Vous devez toujours ajouter le champ address et peut-être d'autres choses que j'ai manqué, mais cela devrait être assez facile à faire.

+0

Excellente réponse! Je n'avais pas réalisé que c'était aussi simple. Merci beaucoup. – doctororange

1

Généralement, dans la plupart des langages OO, les membres de la classe ne sont pas exposés au monde extérieur par défaut. Même si c'est le cas (comme dans certaines langues), il est considéré comme une mauvaise pratique d'accéder directement aux membres du groupe. Lorsque vous ajoutez des membres à une classe (par exemple, ajoutez Classes d'étudiants à l'école), vous devez ajouter les fonctions d'accès pour fournir au monde extérieur l'accès à ces membres.

Voici quelques ressources utiles si vous voulez en savoir plus (trouvé par googler: rubis accesseurs):

http://juixe.com/techknow/index.php/2007/01/22/ruby-class-tutorial/

http://www.rubyist.net/~slagell/ruby/accessors.html

+0

Merci. J'utilise attr_accessor pour accéder aux attributs des écoles et des étudiants, mais je ne sais pas comment dire au programme qu'une école a beaucoup d'élèves. – doctororange

Questions connexes