23

Voglio ActiveRecord cercare una colonna non id da una tabella. Spero che questo sia chiaro quando ti do il mio esempio di codice.Rails: ricerca chiave esterna non idattiva ActiveRecord

class CoachClass < ActiveRecord::Base 
    belongs_to :coach 
end 

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

Quando faccio un coach_obj.coach_classes, questo innesca giustamente

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

(2 è il quel id qui allenatore che è il mio problema.)

voglio che innescare

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

("David" è ildi quell'allenatore)

user_name è unico e presente in entrambe le tabelle.

Non voglio avere un coach_id nella mia tabella coach_classes per qualche motivo.

+0

avviso non richiesto: è possibile prendere in considerazione l'aggiunta di un coach_id alla tabella, renderà più semplice se questa relazione diventa nidificata e più convenzionale. –

+0

Grazie Jed. Ma non voglio coach_id lì per qualche motivo. – Garfield

risposta

51

penso che è necessario specificare le opzioni chiave primaria delle associazioni, nonché:

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 

Questa specifica il metodo che restituisce la chiave primaria dell'oggetto associato (inadempiente a id).

+0

John, sei sicuro che l'altro lato dell'associazione abbia un effetto qui? Si potrebbe semplicemente avere 'has_many', senza un' belongs_to' dall'altra parte. –

+0

@neutrino Ho modificato la mia risposta. –

+0

Grazie John! Ora è molto più chiaro su come sta guardando. – Garfield

-4

è necessario utilizzare 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

Nota: l'hanno portato via nelle versioni successive. Davvero un vero toccasana quando la loro "magia" non ha la funzionalità di cui hai bisogno. – JosephK

9

C'è un'opzione chiamata primary_key che è per default impostato a :id. Si desidera utilizzare:

utilizzare anche queste opzioni sul belongs_to associazione.

Ulteriori informazioni su documentation.

Problemi correlati