Rails: No id búsqueda de clave externa ActiveRecord


Quiero que ActiveRecord busque una columna sin id de una tabla. Espero que esto quede claro cuando te dé mi ejemplo de código.

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, esto desencadena correctamente

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

(2 siendo ese entrenador id aquí, que es mi problema.)

Quiero que se active

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

('David' es el entrenador user_name)

user_name es único y presente en ambas tablas.

No quiero tener un coach_id en mi tabla coach_classes por alguna razón.

Author: Garfield, 2010-07-23

3 answers

Creo que también debe especificar las opciones de clave primaria en las asociaciones:

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).

 51
Author: John Topley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-23 11:34:05

Hay una opción llamada primary_key que por defecto está establecida en :id. Desea utilizar:

has_many :coach_classes, :foreign_key => :user_name, :primary_key => :user_name

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

Lea más en la documentación .

 9
Author: Marcel Jackwerth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-23 11:31:43

Necesitas usar finder_sql:

class Coach < ActiveRecord::Base
    has_many :coach_classes, :finder_sql => 'SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = "#{user_name}")'
end
 -4
Author: alex.zherdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-23 11:28:36