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