2010-03-10 3 views
1

Je tire des données de Harvest. Voici mes deux modèles et schémas:Comment est-ce que foreign_key fonctionne dans cette relation simple has_many, belongs_to?

# schema 
create_table "clients", :force => true do |t| 
    t.string "name" 
    t.integer "harvest_id"  
end 

create_table "projects", :force => true do |t| 
    t.string "name" 
    t.integer "client_id" 
    t.integer "harvest_id" 
end 

# Client.rb 
has_many :projects, :foreign_key => 'client_id' # not needed, I know 

# Project.rb 
belongs_to :client, :foreign_key => 'harvest_id' 

Je suis en train de faire les projets pour trouver leur client en faisant correspondre Project.client_id à un Client.harvest_id. Voici ce que je reçois à la place.

> Project.first.client_id 
=> 187259 

Project.first.client 
=> nil 

Client.find(187259).projects 
=> [] 

Est-ce possible? Merci!

Répondre

0

peut ne pas sembler intuitive, mais le foreign_key pour les relations doit être le même. Supposons que vous décidiez d'utiliser harvest_id comme clé étrangère. Il devrait être mis en place comme ceci:

# Client.rb 
has_many :projects, :foreign_key => 'harvest_id' 

# Project.rb 
belongs_to :client, :foreign_key => 'harvest_id' 

vous auriez également que le champ harvest_id dans le tableau des projets, étant donné que les projets has_many client.

0

Étant donné que votre relation belongs_to dans le modèle de projet est sur harvest_id, vous devez vous assurer que l'attribut harvest_id est défini dans l'objet de projet.

> Project.first.harvest_id 
=> ?? 

Votre problème peut se produire si le harvest_id n'est pas défini.

0

Les projets pour trouver leur client en faisant correspondre le projet. client_id à un client. harvest_id

Cela ne semble pas logique que le client et la récolte sont censés être différents objets/dossiers et vous ne pouvez pas les faire correspondre. C'est comme "Trouvez des pommes là où il y a des graines de type orange".

Nous avons donc probablement besoin de plus de contexte.


Vous avez défini vos relations de la façon suivante:

Du côté du projet vous dites « il est lié au client par l'intermédiaire client_id », mais sur le client, vous dites que «il est lié à Projet via harvest_id "

Il y a des divergences.

Il semble donc que vous ayez juste défini des mappages incorrects.

Je ne sais pas comment harvest_id est censé être utilisé, il en sera de faire l'hypothèse qu'il est juste association:

# Client.rb 
has_many :projects 
belongs_to :harvest 

# Project.rb 
belongs_to :client 
belongs_to :harvest 

# Harvest 
has_one :client 
has_one :project 
Questions connexes