23

Je veux ActiveRecord Lookup par une colonne non-id d'une table. J'espère que ceci est clair quand je vous donne mon exemple de code.Rails: Non id clé étrangère recherche ActiveRecord

class CoachClass < ActiveRecord::Base 
    belongs_to :coach 
end 

class Coach < ActiveRecord::Base 
    has_many :coach_classes, :foreign_key => 'user_name' 
end 

Quand je fais une coach_obj.coach_classes, ce qui déclenche à juste titre

SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 2) 

(2 étant le id de cet entraîneur ici qui est mon problème.)

Je veux déclencher

SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 'David') 

('David' est leque l'entraîneur de)

user_name est unique et présente dans les deux tableaux.

Je ne veux pas avoir un coach_id dans ma table coach_classes pour une raison quelconque.

+0

conseils non sollicités: vous voudrez peut-être envisager d'ajouter un coach_id à la table, il sera plus facile si cette relation devient imbriqué et plus classique. –

+0

Merci Jed. Mais je ne veux pas coach_id là pour une raison quelconque. – Garfield

Répondre

51

Je pense que vous devez spécifier les options clés primaires sur les associations ainsi:

class CoachClass < ActiveRecord::Base 
    belongs_to :coach, :foreign_key => 'user_name', :primary_key => 'user_name' 
end 

class Coach < ActiveRecord::Base 
    has_many :coach_classes, :foreign_key => 'user_name', :primary_key => 'user_name' 
end 

Cela spécifie la méthode qui renvoie la clé primaire de l'objet associé (par défaut à id).

+0

John, êtes-vous sûr que l'autre côté de l'association a un effet ici? On pourrait simplement avoir 'has_many', sans un' belongs_to' de l'autre côté. –

+0

@neutrino J'ai modifié ma réponse. –

+0

Merci John! C'est beaucoup plus clair maintenant sur la façon dont il regarde en l'air. – Garfield

-4

Vous devez utiliser finder_sql:

class Coach < ActiveRecord::Base 
    has_many :coach_classes, :finder_sql => 'SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = "#{user_name}")' 
end 
+0

Note - ils l'ont emporté dans les versions ultérieures. Vraiment une bouée de sauvetage quand leur «magie» n'a pas la fonctionnalité dont vous avez besoin. – JosephK

9

Il y a une option appelée primary_key qui est par défaut à :id. Vous souhaitez utiliser:

Utilisez également ces options sur l'association belongs_to.

En savoir plus dans le documentation.