23

Quiero ActiveRecord para buscar por una columna sin identificación de una tabla. Espero que esto quede claro cuando le doy mi muestra de código.Rieles: búsqueda de clave externa sin identificación ActiveRecord

class CoachClass < ActiveRecord::Base 
    belongs_to :coach 
end 

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

Cuando hago un coach_obj.coach_classes, esta razón desencadena

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

(2 siendo el de id aquí que el entrenador que es mi problema.)

quiero que desencadenan

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

('David' siendo el entrenador user_name)

user_name es único y está presente en ambas tablas. Por alguna razón, no quiero tener un coach_id en mi tabla .

+0

consejos no solicitados: es posible que desee considerar agregar un coach_id a la tabla, será más fácil si esta relación se anida y es más convencional. –

+0

Gracias Jed. Pero no quiero coach_id allí por alguna razón. – Garfield

Respuesta

51

creo que es necesario especificar las opciones de clave principal en las asociaciones, así:

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 

Esto especifica el método que devuelve la clave primaria del objeto asociado (por defecto a id).

+0

John, ¿estás seguro de que el otro lado de la asociación tiene un efecto aquí? Uno podría simplemente tener 'has_many', sin un' belongs_to' en el otro lado. –

+0

@neutrino He editado mi respuesta. –

+0

Gracias John! Ahora es mucho más claro sobre cómo está mejorando. – Garfield

-4

Es necesario utilizar 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: se llevaron esto en versiones posteriores. Realmente un salvavidas cuando su 'magia' no tiene la funcionalidad que necesita. – JosephK

9

hay una opción llamada primary_key que está configurado de fábrica para :id. Que desea utilizar:

utilizar también estas opciones en la asociación belongs_to.

Lea más en el documentation.

Cuestiones relacionadas