2010-09-28 3 views
1

Je suis tout à fait nouveau à rubis sur des rails, mais je le trouve phantastique.Plusieurs références de modèle de rails sur une table

En tout cas, je construis actuellement mon ensemble de modèles, pour ainsi dire. J'ai un modèle Places, généré comme ceci:

rails generate scaffold Place name:string description:text type:string 

Maintenant, je veux faire un modèle Route entre deux endroits, tenant une distance. Comment puis-je faire cela, j'ai seulement vu comment faire des références à un seul modèle jusqu'à présent.

Merci pour votre écoute ...

+1

Il y a beaucoup de tutoriels pour ça. Par exemple, http://guides.rubyonrails.org/association_basics.html –

Répondre

3

Vous devez créer un modèle appelé Route, devrait ressembler à ceci:

Première génération avec échafaudage

rails g scaffold Route start_place_id:integer end_place_id:integer distance:decimal 

exécuter les migrations

Ensuite, vous devez configurer les relations. Un lieu peut être un point de départ ou un point final, car l'identification n'est pas triviale par la relation, nous devons spécifier la classe et la clé étrangère pour fonctionner correctement (dans un simple a beaucoup d'association que nous pouvons faire has_many: routes et belongs_to: place, mais ce n'est pas le cas) route.rb

class Route<ActiveRecord::Base 
belongs_to :start_place, :class_name=>"Place", :foreign_key=>"start_place_id" 
belongs_to :end_place, :class_name=>"Place", :foreign_key=>"end_place_id 
end 

Dans votre place.rb vous devez ajouter

class Place<ActiveRecord::Base 
    has_many :routes_as_start, :class_name=>"Place", :foreign_key=>"start_place_id" 
    has_many :routes_as_end, :class_name=>"Place", :foreign_key=>"end_place_id" 
end 

pour construire une relation, vous pouvez faire comme ceci:

route = @place.routes_as_start.build 
route.end_place = Place.create 
route.save 

Cela devrait également créer un itinéraire avec une destination finale.

+0

Merci, cela m'a beaucoup aidé. –

+0

Si c'est la solution, veuillez choisir cette bonne réponse, en cliquant sur le petit tuyau près de ce poste. – dombesz

0

Pour les associations Rails je vérifierais:

http://guides.rubyonrails.org/association_basics.html

En outre, une distance est plus d'un attribut d'un lieu. Par exemple, Place.find(1).location = (x,y) et Place.find(2).location = (x,y). Et puis dans votre modèle, , vous pouvez écrire une méthode pour les distances.

def distance(first_place, second_place) 
    ... 
end 

Il y a un petit bijou doux pour que ici: http://geokit.rubyforge.org/api/geokit-gem/index.html

Pour installer le type:

sudo gem install geokit 
Questions connexes